【问题标题】:fields_for in the show view, nested attributes显示视图中的fields_for,嵌套属性
【发布时间】:2013-06-17 11:21:23
【问题描述】:

我在学习 rails 时想尝试模仿一些 stackoverflow 功能。特别是当问题有很多答案并且评论属于问答系统时,我对问答系统感兴趣。所以,我从关联和嵌套属性开始。嵌套属性的学习来源是 railcast.com,Ryan 正在将表单(问题,答案)添加到 new.html.erb(调查),但我想添加到 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

问题.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

【问题讨论】:

  • 尝试用f.fields_for :answers, @question.answers.build do |builder|替换fields_for

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


【解决方案1】:

在 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

【讨论】:

    【解决方案2】:

    好的,让我们看看您的代码中发生了什么。 首先,在控制器中,您会找到一个 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|
    

    始终只有一种答案形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2014-03-22
      • 1970-01-01
      相关资源
      最近更新 更多