あなたが必要としているのは、まさにこれらのレールキャストで説明されているものだと思います:
また、少しリファクタリングする必要があると思います。投稿には質問があってはなりません。レールキャストとは少し違いがあることに気付くかもしれませんが、それは質問ごとに 1 つの回答しかないのに対し、レールキャストでは質問に多くの回答があるためです。パート 2 では、AJAX 呼び出しを追加して質問と回答を追加/削除する方法を示します (回答が 1 つしかない場合は、おそらくこれは必要ありません)。
アソシエーションとネストされた属性がどのように機能するかをよりよく理解できるように、必ず読んでください。
これは、最小限の微調整でおそらくうまくいく例です。セマンティック フィールドは使用していません。標準のフォーム ビルダーのみを使用しています。
class Post < ActiveRecord::Base
has_many :questions
accepts_nested_attributes_for :questions, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
end
class Question < ActiveRecord::Base
belongs_to :post
has_one :answer, :dependent => :destroy
accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:content].blank? }, :allow_destroy => true
end
class Answer < ActiveRecord::Base
belongs_to :question
end
# posts_controller.rb
def new
@post = Post.new
# lets add 2 questions
2.times do
question = @post.questions.build
question.build_answer
respond_to do |format|
format.html
end
end
# views/posts/_form.html.erb
<%= form_for @post do |f| %>
<%= f.error_messages %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<%= f.fields_for :questions do |builder| %>
<%= render "question_fields", :f => builder %>
<% end %>
<p><%= f.submit "Submit" %></p>
<% end %>
# views/posts/_question_fields.html.erb
<p>
<%= f.label :content, "Question" %><br />
<%= f.text_area :content, :rows => 3 %><br />
<%= f.check_box :_destroy %>
<%= f.label :_destroy, "Remove Question" %>
</p>
<%= f.fields_for :answers do |builder| %>
<%= render 'answer_fields', :f => builder %>
<% end %>
# views/posts/_answer_fields.html.erb
<p>
<%= f.label :content, "Answer" %>
<%= f.text_field :content %>
<%= f.check_box :_destroy %>
<%= f.label :_destroy, "Remove" %>
</p>