显示视图中的fields_for,嵌套属性

时间:2013-06-17 11:21:24

标签: ruby-on-rails ruby-on-rails-3 nested-attributes

虽然我正在学习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

2 个答案:

答案 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|

始终只有一个答案表。