Rails AJAX: Mes besoins partiels d'une instance de FormBuilder
-
21-08-2019 - |
Question
J'ai une forme dans mon application Rails qui utilise un FormBuilder personnalisé pour me donner quelques balises de champs personnalisés
<% form_for :staff_member, @staff_member, :builder => MyFormBuilder do |f| %>
[...]
<%= render :partial => "staff_members/forms/personal_details", :locals => {:f => f, :skill_groups => @skill_groups, :staff_member => @staff_member} %>
[...]
<% end %>
Maintenant, cette partie se trouve dans une zone de la forme qui obtient remplace par un rappel AJAX. Ce que je finis par faire du contrôleur en réponse à la requête AJAX est:
render :partial => "staff_members/forms/personal_details", :locals => {:skill_groups => @skill_groups, :staff_member => @staff_member}
Cependant, si je fais ça alors les pauses de forme, comme l'objet FormBuilder je dans le form_for n'est plus disponible. Est-il possible pour moi d'utiliser mon habitude FormBuilder objet à l'intérieur d'une occasion partielle pour un rappel AJAX?
La solution
Utilisez l'intérieur de votre partie fields_for
. Il effectue une tâche similaire, mais sans envelopper les balises de formulaire. Voir l'API docs .
Autres conseils
que diriez-vous?
@template.with_output_buffer do
@template.form_for @model_object do |f|
f.fields_for :some_nested_attributes do |ff|
render :partial => 'nested_attributes', :object => @model_object, :locals => {:form => ff}
end
end
end
ce serait particulièrement utile est que vous devez utiliser le fields_for imbriquée dans la partie
Vous pouvez instancier une nouvelle instance de votre générateur de formulaire dans le contrôleur, mais il se sent en quelque sorte moche pour moi:
# in the controller
render :partial => {
:f => MyFormBuilder.new(:staff_member, @staff_member, template),
:skill_groups => @skill_groups,
:staff_member => @staff_member
}
Vous pouvez également être côté client, vous pouvez déplacer plus de la logique de mise à jour qui ne vous demandera pas à vous soucier de quoi que ce soit rendu. Vous pouvez simplement mettre à jour les valeurs via JS. Je ne sais pas si cela fonctionne pour votre projet bien.
Peut-être que je suis un peu en retard dans le jeu ici, et peut-être que je ne comprends pas bien la question, mais ApplicationHelper.rb je pense que vous pouvez simplement ajouter la ligne:
ActionView::Base.default_form_builder = MyFormBuilder
Vous pouvez soumettre au sein de votre ajax appeler le contenu de f.object_name (il est travaille également avec partials) et l'utiliser pour rendre les balises définies dans http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html passant comme premier argument.