Problèmes d'affichage des champs de formulaire imbriqués
-
03-07-2019 - |
Question
J'essaie d'implémenter des formes d'objet imbriquées pour mon site en utilisant comme guide le blog de Ryan Daigle ( http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes ). Pour une raison quelconque, les champs de formulaire imbriqués n'apparaissent pas dans la vue.
class Instruction < ActiveRecord::Base
has_many :steps
accepts_nested_attributes_for :steps
end
class Step < ActiveRecord::Base
belongs_to :instruction
end
<% form_for @instruction do |instruction_form| %>
<%= instruction_form.error_messages %>
<p>
<%= instruction_form.label :title %><br />
<%= instruction_form.text_field :title %>
</p>
<p>
<%= instruction_form.label :difficulty %><br />
<%= instruction_form.text_field :difficulty %>
</p>
<% instruction_form.fields_for :steps do |step_form| %>
<%= step_form.label :explanation, 'Explanation: ' %>
<%= step_form.text_field :explanation %>
<% end %>
<p><%= instruction_form.submit "Submit" %></p>
<% end %>
Lorsque je change instruction_form.fields_for: étapes faire | étape_form |
en instruction_form.fields_for: étape do | étape_form |
, le formulaire est rendu mais lors de la soumission, je reçois un Erreur 'attribut inconnu: étape'.
Ce que je fais semble correspondre au tutoriel. Que dois-je vérifier? Merci.
La solution
Que se passe-t-il dans votre contrôleur? Je n'ai pas encore lu le didacticiel et je n'arrive pas à l'arracher pour le moment (en bas?), Mais construisez-vous un objet en mémoire à remplir?
dans votre contrôleur, dans votre " nouveau " action, assurez-vous que vous êtes
@instruction = Instruction.new
@instruction.steps.build
Ceci instanciera une étape
en mémoire sous la forme d'un "espace réservé". pour votre formulaire à remplir. . . du moins, c’est ce que je fais dans mon propre contrôleur lorsqu’on utilise un uses_nested_attributes_for
, et cela fonctionne très bien.
Faites-moi savoir si cela fonctionne, et une fois que je pourrai consulter le didacticiel, il me faudra peut-être l'éditer