-1

在我学习 rails 的时候想尝试模仿一些 stackoverflow 的特性。特别是当问题有很多答案并且评论属于问答系统时,我对问答系统感兴趣。所以,我从关联和嵌套属性开始。嵌套属性的学习来源是 railcast.com,Ryan 正在将表单(问题,答案)添加到 new.html.erb(调查),但我想添加到 show.html.erb。当我这样做时它看起来很好,除非我发布一些东西。首次提交答案后,问题展示呈现已发布的答案、空的答案表单并填充文本答案表单。所以总的来说,我有答案和两种形式(一个是空的,另一个是文本)。我怎样才能让答案只呈现空表单?

显示.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

问题.rb

 has_many :answers
 accept_nested_attributes_for :answer
 accept_nested_attributes_for :comment

答案.rb

 belongs_to :question
 accept_nested_attributes_for :comment

评论.rb

 belongs_to :answer
 belongs_to :question

questions_controller.rb

 def show
 @question = Question.find(params[:id])
 @question.answers.build
 end
4

2 回答 2

2

在 Michał Szyndel 案例中,rails 很可能会给你一个错误 can't mass-assign attributes 答案。就像 Manoj Monga 建议的那样,试着这样做:

form_for @question do |f|
  f.fields_for :answers, @question.answers.build do |builder|
  builder.text_area :body
end
   f.submit
end
于 2013-06-17T12:54:12.077 回答
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

仅显示保存到数据库的答案(尝试向 Answer 添加内容长度验证,看看如果您尝试保存无效答案会发生什么情况)

对于表格,只需执行

f.fields_for Answer.new do |builder|

始终只有一种答案形式。

于 2013-06-17T11:43:38.873 回答