Voici l'approche de base que j'ai adoptée dans l'une de mes applications. Le problème a de nombreuses réponses - le problème est un document, la réponse est un document intégré. Vous pouvez utiliser le lien "ajouter une réponse" pour générer un autre champ de réponse, et le lien "supprimer" pour en supprimer un.
_form.html.erb :
<% form_for @problem do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :content %><br />
<%= f.text_area :content, :size => '50x7' %>
</p>
...etc...
<%= add_answer_link "(add answer)" %>
<div id="answers">
<%= render :partial => 'answer', :collection => @problem.answers %>
</div>
<p><%= f.submit "Submit" %></p>
<% end %>
_answer.html.erb :
<div class="answer">
<% fields_for 'problem[answers]', answer, :index => nil do |f| -%>
<%= f.label :content, "Answer #{answer.id}:" %>
<%= f.text_field :content, :size => 50 %>
<%= link_to_function "(remove)", "$(this).up('.answer').remove()" %>
<% end -%>
</div>
problemes_helper.rb
module ProblemsHelper
def add_answer_link(name)
link_to_function name do |page|
page.insert_html :bottom, "answers", :partial => 'answer', :object => Answer.new
end
end
end
J'ai supprimé quelques éléments mineurs de l'implémentation, mais cela devrait fonctionner.