0

我发现了很多关于这个 Railscast 的帖子,但所有的建议都没有帮助我。我已经能够在视图中呈现一个嵌套的表单字段,但只有一个,而不是我在控制器中调用的 3 个。当我提交时,我收到错误:无法批量分配受保护的属性:线索

章节.rb

class Chapter < ActiveRecord::Base
 belongs_to :trail
 has_many :clues, :dependent => :destroy
 accepts_nested_attributes_for :clues
 attr_accessible :asset, :assetkind, :description, :gate, :name, :trail, :trail_id, :cover
.
.
.

end

线索.rb

class Clue < ActiveRecord::Base
 attr_accessible :chapter_id, :theclue, :typeof, :chapter
 .
 .
 .
 belongs_to :chapter
end

在 railcast 中,它说使用 :clues 的等价物,这会呈现 3 个字段。但在我的,它没有渲染字段。相反,我使用@chapter.clues,它只呈现一个。

我制作新章节时的表格。

<h1>Add a New Chapter</h1>
<h3>Add To Trail : <%= @trail.title %></h3><br>
<%= form_for [@trail, @trail.chapters.build] do |f| %>

<h6>About the Chapter</h6>
    <%= f.label :name, 'Chapter Name' %>
    .
    .
    .
<h6>Progressing the Story</h6>
    <%= f.fields_for @chapter.clues do |builder| %>
    <p>
        <%= builder.label :theclue, "Enter Clue" %>
        <%= builder.text_area :theclue, :rows => 2 %>
    </p>
<% end %>
     .
     .
     .
<% end %>

我的 chapters_controller.rb 新

class ChaptersController < ApplicationController

def new
  @trail = Trail.find(params[:trail_id])
  @chapter = Chapter.new
  @title = "Chapter"
  3.times { @chapter.clues.build }
  logger.debug "CHAPTER!!!!!!!!!!!!new: am i in a trail? #{@trail.to_yaml}"
  logger.debug "CHAPTER!!!!!!!!!!!!new: am i in a clue? #{@chapter.clues.to_yaml}"
end

我的日志显示了 3 条线索,但属性为空(没有:id)。这是有问题的迹象吗?因此,即使我的日志显示了 3 个线索对象,我的视图也只显示了一个。

想法?感谢关于 stackoverflow 的建议,我已经添加到 chapter.rb

attr_accessible :clues_attributes 

并且没有运气,同样的行为和错误,无论有没有。

在此先感谢您的时间

4

2 回答 2

1

我自己想通了。不知道为什么,我会推测,如果我不在,欢迎有人更好地解释它。

问题在这里:

<%= form_for [@trail, @trail.chapters.build] do |f| %>

我改为:

<%= form_for @chapter do |f| %>

然后我不得不在我的 chapters_controller 中改变一些东西来制作 trails 对象并捕获 id。但是,在我进行此更改后,我的 3 个线索字段开始出现在视图中,并且我关于质量分配的错误消失了。

我认为我之前创建的章节是空的并且没有真正生成,只保存信息,因此尝试使用线索 form_for 保存嵌套信息是临时数据的另一个步骤......在我的控制器中创建对象然后填充它形式更加充实......我知道真正的技术......就像我说的,我让它工作了,不要问我如何......但我开始理解 Rails 的想法。

于 2012-05-16T18:26:41.193 回答
0

当我提交时,我收到错误:无法批量分配受保护的属性:线索

这告诉您该属性不受批量分配的保护。基本上,您能够设置它的唯一方法是通过代码中的方法,而不是通过用户输入。(通常通过模型上的 update_attributes 分配。)

您需要做的是在models/chapter.rb 中将:clue 添加到attr_accessible。

您可能还想添加 :clues - 我认为它实际上应该给您提供 :clues 受保护的错误。您可能会遇到 :clue_ids 的问题。无论它说什么都是受保护的,只需在该模型中放入 attr_accessible 方法,您就应该能够从用户输入中更新它。

于 2012-05-16T14:28:10.513 回答