Đây là cách tiếp cận cơ bản mà tôi đã thực hiện trong một trong các ứng dụng của mình. Vấn đề có nhiều câu trả lời - vấn đề là một tài liệu, câu trả lời là một tài liệu nhúng. Bạn có thể sử dụng liên kết "thêm câu trả lời" để tạo một trường câu trả lời khác và liên kết "xóa" để xóa một trường.
_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>
problem_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
Tôi đã cắt bỏ một vài phần nhỏ trong quá trình triển khai, nhưng điều đó sẽ hoạt động.