0

我正在尝试制作一种动态形式的问题和答案,如下所示:

问题_ __ _ __ _

回答 _ __ _ __ _

问题_ __ _ __ _

回答 _ __ _ __ _

我不知道如何以交替对的形式循环这两个资源。我试过这个:

<%= 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 %>

但它给了我错误“数组:类的未定义方法`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

我认为您需要的正是这些铁路广播中描述的内容:

我认为你也应该重构一下,帖子应该没有问题。您可能会注意到与 railcasts 的一点不同,但那是因为每个问题只有一个答案,而在 railcasts 中,一个问题有很多答案。在第 2 部分中,它展示了如何添加 AJAX 调用以添加/删除问题和答案(如果您只有一个答案,可能不需要这个)。

必读,以便您更好地了解关联以及嵌套属性的工作原理:

这是一个可能会起作用的示例,只需进行一些最低限度的调整。我没有使用语义字段,只是使用标准表单构建器。

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 回答
0

所以我个人不使用formtastic,但我知道它遵循与simple_form类似的路线。您的错误来自尝试将 Array 传递给 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 回答