我正试图制作一个动态的问答形式,如下:
问题 _ __ _ __ _
回答 _ __ _ __ _
问题 _ __ _ __ _
回答 _ __ _ __ _
我无法弄清楚如何将两个资源作为交替对循环。我试过这个:
<%= 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
答案 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,则您需要替换上面代码中的相关符号。