虽然我正在学习rails想要尝试模仿一些stackoverflow功能。特别是当问题有很多答案时,我对Q& A系统感兴趣,而评论属于问答。所以,我从关联和嵌套属性开始。嵌套属性的学习源是railcast.com,Ryan正在向new.html.erb(Survey)添加表单(问题,答案),但是我想添加到show.html.erb。当我这样做它看起来很好,除非我发布一些东西。在第一次提交答案后,问题显示呈现答案,空表格答案并填写文本答案表格。总的来说,我有答案和两种形式(一种是另一种形式的文本)。如何才能将渲染空表单作为答案?
show.html.erb
@question.answers.each do |answer|
answer.body
end
form_for @question do |f|
f.fields_for :answers do |builder|
builder.text_area :body
end
f.submit
end
question.rb
has_many :answers
accept_nested_attributes_for :answer
accept_nested_attributes_for :comment
answer.rb
belongs_to :question
accept_nested_attributes_for :comment
comment.rb
belongs_to :answer
belongs_to :question
questions_controller.rb
def show
@question = Question.find(params[:id])
@question.answers.build
end
答案 0 :(得分:2)
在MichałSzyndel案例中,rails很可能会给你一个错误,无法分配属性答案。像Manoj Monga建议只是尝试这样做:
form_for @question do |f|
f.fields_for :answers, @question.answers.build do |builder|
builder.text_area :body
end
f.submit
end
答案 1 :(得分:0)
好的,让我们看看您的代码中发生了什么。 首先,在控制器中,您找到了一个Question对象
@question = Question.find(params[:id])
并为一个新的/空答案构建关联
@question.answers.build
所以应该有@question
附加的新答案对象然后在视图中首先显示所有现有问题
@question.answers.each do |answer|
answer.body
end
它运作正常(现在,我会告诉你如何在一段时间内打破它)
然后显示您希望在控制器中初始化的新答案的表单(@question.answers.build
)
那么为什么现有答案有一个表格? Rails真正做的是它需要与@question相关的所有答案,并为每个答案构建一个表单。而且,既然你添加了一个答案,那么......两个!一个现有的,一个刚刚用@question.answers.build
那么,如何修复此代码?请关注
@question.answers.select(&:persisted?).each do |answer|
answer.body
end
仅显示保存到数据库的答案(尝试在答案中添加内容长度验证,看看如果您尝试保存无效的内容会发生什么)
对于表单,只需
f.fields_for Answer.new do |builder|
始终只有一个答案表。