如何循环表单上的两个交替资源?

时间:2012-06-28 13:31:46

标签: ruby-on-rails formtastic

我正试图制作一个动态的问答形式,如下:

问题 _ __ _ __ _

回答 _ __ _ __ _

问题 _ __ _ __ _

回答 _ __ _ __ _

我无法弄清楚如何将两个资源作为交替对循环。我试过这个:

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

2 个答案:

答案 0 :(得分:0)

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

我认为你也应该重构一下,帖子不应该有问题。您可能会注意到与铁路广播略有不同,但那是因为每个问题只有一个答案,而在铁路广播中,一个问题有很多答案。在第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>

答案 1 :(得分: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

上的表格文档

这应该会在视图中正确显示您的表单,但是您需要向问题控制器添加更多内容以确保它保存答案(如果我弄错了,有人会纠正我)。

此外,您的问题和答案表确实有问题和答案栏吗?如果列实际上类似于:body,则您需要替换上面代码中的相关符号。