0

私は次のように動的な形式の質問と回答を作成しようとしています。

質問____ __ _ _ _

回答 ____ __ _ _ _

質問____ __ _ _ _

回答 ____ __ _ _ _

2つのリソースを交互のペアとしてループする方法がわかりません。私はこれを試しました:

<%= semantic_fields_for [@question, @answer] do |h, i| %>
  <%= f.inputs :for => @question do |h|%>
    <%= h.input :question %>
  <% end %>
  <%= f.inputs :for => @answer do |i|%>
    <%= i.input :answer %>
  <% end %>
<% end %>

しかし、「Array:Classの未定義のメソッド`model_name'」というエラーが表示されます。

私のコントローラー:

def new

  @post = Post.new
  @question = @post.questions.new
  @answer = @question.build_answer

  respond_to do |format|
    format.html
  end
end

そして私のモデル:

class Post < ActiveRecord::Base
  has_many :questions
  has_many :answers
end
class Question < ActiveRecord::Base
  belongs_to :post
  has_one :answer
end
class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :post
end
4

2 に答える 2

0

したがって、私は個人的に formtastic を使用していませんが、simple_form と同様の行に従うことは理解しています。あなたのエラーは、配列を単一のオブジェクトのみを取るsemantic_fields_forに渡そうとしたことに起因しています:

<%= semantic_form_for @questions do |q| %>
  <%= q.input :question %>
  <%= q.semantic_fields_for @answer do |a| %>
    <%= a.inputs :answer %>
  <% end %>
  <%= q.actions %>
<% end %>

モデルをaccepts_nested_attributes_forで正しくセットアップする必要があることを忘れないでください

class Question < ActiveRecord::Base
  belongs_to :post
  has_one :answer
  accepts_nested_attributes_for :answers
end

https://github.com/justinfrench/formtasticで formtastic のドキュメントを確認してください。

これでビューにフォームが正しく表示されるはずですが、質問コントローラーにさらに追加して、回答が確実に保存されるようにする必要があります(間違っている場合は誰かが私を修正してください)。

また、質問と回答の表に実際に質問と回答の列があることは明らかです。列が実際に :body のようなものである場合は、上記のコードで関連する記号を置き換える必要があります。

于 2012-06-28T16:00:33.307 に答える
0

あなたが必要としているのは、まさにこれらのレールキャストで説明されているものだと思います:

また、少しリファクタリングする必要があると思います。投稿には質問があってはなりません。レールキャストとは少し違いがあることに気付くかもしれませんが、それは質問ごとに 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>
于 2012-06-28T15:53:41.150 に答える