Configurer l'étiquette de has_many administrateur actif
-
25-10-2019 - |
Question
Eh bien, j'ai deux modèles en rapport avec un sur-à-plusieurs assoc.
#models/outline.rb
class Outline < ActiveRecord::Base
has_many :documents
end
#models/document.rb
class Document < ActiveRecord::Base
belongs_to :outline
end
#admin/outlines.rb
ActiveAdmin.register Outline do
form do |f|
f.inputs "Details" do
f.input :name, :required => true
f.input :pages, :required => true
...
f.buttons
end
f.inputs "Document Versions" do
f.has_many :documents, :name => "Document Versions" do |d|
d.input :file, :as => :file
d.buttons do
d.commit_button :title => "Add new Document Version"
end
end
end
end
end
Eh bien comme vous pouvez le voir dans l'admin / outlines.rb je l'ai déjà essayé de placer le nom, dans le has_many: documents, et: titre dans le commit_button, mais ni de ce travail d'options, j'ai aussi essayé avec: légende,: titre et: étiquette, au lieu de: nom dans le .has_many. Ne fonctionne pas.
Ceci est le résultat de ce code: Capture d'écran
Ce que je veux afficher est « Versions de document » au lieu de « Documents » et « Ajouter une nouvelle version du document » au lieu de « Ajouter un nouveau document »
Si quelqu'un peut avoir une solution, il serait grand
Autres conseils
tests ActiveAdmin ( "devrait se traduire par le nom de l'association en-tête "), il peut y avoir une autre façon de le faire. Utilisez votre fichier de traduction.
Si vous regardez ActiveAdmin méthode has_many ( beurk !!! 46 lignes de code séquentiel), il utilise
Un hack est que vous pouvez cacher la balise h3 par son style. actifs / stylesheets / active_admin.css.scss Cela permet de masquer toute balise h3 sous une classe has_many. .has_many {
h3 {
display: none;
}}
Sjors réponse est en fait un bon point de départ pour résoudre la question. Je monkeypatched Administrateur actif dans config / initializers / active_admin.rb avec ce qui suit:
module ActiveAdmin
class FormBuilder < ::Formtastic::FormBuilder
def titled_has_many(association, options = {}, &block)
options = { :for => association }.merge(options)
options[:class] ||= ""
options[:class] << "inputs has_many_fields"
# Set the Header
header = options[:header] || association.to_s
# Add Delete Links
form_block = proc do |has_many_form|
block.call(has_many_form) + if has_many_form.object.new_record?
template.content_tag :li do
template.link_to I18n.t('active_admin.has_many_delete'), "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
end
else
end
end
content = with_new_form_buffer do
template.content_tag :div, :class => "has_many #{association}" do
form_buffers.last << template.content_tag(:h3, header.titlecase) #using header
inputs options, &form_block
# Capture the ADD JS
js = with_new_form_buffer do
inputs_for_nested_attributes :for => [association, object.class.reflect_on_association(association).klass.new],
:class => "inputs has_many_fields",
:for_options => {
:child_index => "NEW_RECORD"
}, &form_block
end
js = template.escape_javascript(js)
js = template.link_to I18n.t('active_admin.has_many_new', :model => association.to_s.singularize.titlecase), "#", :onclick => "$(this).before('#{js}'.replace(/NEW_RECORD/g, new Date().getTime())); return false;", :class => "button"
form_buffers.last << js.html_safe
end
end
form_buffers.last << content.html_safe
end
end
end
Maintenant, dans mon fichier admin je appelle titled_has_many comme has_many mais je passe. En-tête pour remplacer l'utilisation de l'Association de la balise h3
f.titled_has_many :association, header: "Display this as the H3" do |app_f|
#stuff here
end
Vous pouvez personnaliser l'étiquette du bouton « Ajouter ... » en utilisant le réglage de new_record
sur has_many
. Pour l'étiquette de tête, vous pouvez utiliser heading
:
f.has_many :documents,
heading: "Document Versions",
new_record: "Add new Document Version" do |d|
d.input :file, :as => :file
end
ne mérite pas un prix mais vous pouvez mettre ceci dans config / initializers / active_admin.rb. Il vous permettra d'ajuster les en-têtes que vous voulez en utilisant une config / locales / your_file.yml (vous devez créer l'entrée de custom_translations vous). Ne pas oublier de redémarrer le serveur. Et utiliser le f.hacked_has_many dans votre générateur de formulaire.
module ActiveAdmin
class FormBuilder < ::Formtastic::FormBuilder
def hacked_has_many(association, options = {}, &block)
options = { :for => association }.merge(options)
options[:class] ||= ""
options[:class] << "inputs has_many_fields"
# Add Delete Links
form_block = proc do |has_many_form|
block.call(has_many_form) + if has_many_form.object.new_record?
template.content_tag :li do
template.link_to I18n.t('active_admin.has_many_delete'), "#", :onclick => "$(this).closest('.has_many_fields').remove(); return false;", :class => "button"
end
else
end
end
content = with_new_form_buffer do
template.content_tag :div, :class => "has_many #{association}" do
# form_buffers.last << template.content_tag(:h3, association.to_s.titlecase)
# CHANGED INTO
form_buffers.last << template.content_tag(:h3, I18n.t('custom_translations.'+association.to_s))
inputs options, &form_block
# Capture the ADD JS
js = with_new_form_buffer do
inputs_for_nested_attributes :for => [association, object.class.reflect_on_association(association).klass.new],
:class => "inputs has_many_fields",
:for_options => {
:child_index => "NEW_RECORD"
}, &form_block
end
js = template.escape_javascript(js)
_model = 'activerecord.models.' + association.to_s.singularize
_translated_model = I18n.t(_model)
js = template.link_to I18n.t('active_admin.has_many_new', :model => _translated_model), "#", :onclick => "$(this).before('#{js}'.replace(/NEW_RECORD/g, new Date().getTime())); return false;", :class => "button"
form_buffers.last << js.html_safe
end
end
form_buffers.last << content.html_safe
end
end
end
Si vous avez des problèmes avec des fichiers locaux ne pas être bon chargé en mode mise en scène / production, en ajoutant ceci à votre application.rb pourrait aider (remplacer: nl pour les paramètres régionaux à droite)
config.before_configuration do
I18n.load_path += Dir[Rails.root.join('config','locales','*.{rb,yml}').to_s]
I18n.locale = :nl
I18n.default_locale = :nl
config.i18n.load_path += Dir[Rails.root.join('config','locales','*.{rb,yml}').to_s]
config.i18n.locale = :nl
config.i18n.default_locale = :nl
I18n.reload!
config.i18n.reload!
end
config.i18n.locale = :nl
config.i18n.default_locale = :nl