我发现了很多关于这个Railscast的帖子,但所有的建议都没有帮助我。 我已经能够在视图中渲染一个嵌套的表单字段,但只有一个,而不是我在控制器中调出的3个字段。当我提交时,我收到错误:无法批量分配受保护的属性:线索
Chapter.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
Clue.rb
class Clue < ActiveRecord::Base
attr_accessible :chapter_id, :theclue, :typeof, :chapter
.
.
.
belongs_to :chapter
end
在铁路广播中,它说要使用相当于:线索,这会渲染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条线索,但属性为空(no:id)。这是出错的标志吗?因此,即使我的日志显示3个线索对象,我的视图也只显示一个。
思考?由于有关stackoverflow的建议,我已经添加到chapter.rb
attr_accessible :clues_attributes
并且没有运气,相同的行为和错误,无论有没有。
提前感谢您的时间
答案 0 :(得分:1)
我为自己想出来了。不确定为什么,我会推测,如果我离开,欢迎有人更好地解释。
问题在于:
<%= form_for [@trail, @trail.chapters.build] do |f| %>
我改为:
<%= form_for @chapter do |f| %>
然后我不得不在我的chapters_controller中更改一些东西来制作trail对象并捕获id。但是,在我做了这个改变之后,我的3个线索字段开始显示在视图中,我关于质量分配的错误消失了。
我认为我之前创建的章节是空的,并没有真正生成,只保存信息,所以试图用线索form_for保存嵌套信息是临时数据的另一步......在我的控制器中创建对象然后填写表格更加实质......我知道真的很技术......就像我说的那样,我让它工作,不要问我怎么样......但我开始明白Rails的想法。
答案 1 :(得分:0)
当我提交时,我收到错误:无法批量分配受保护的属性:线索
这告诉您该属性受到质量分配的保护。基本上,您能够设置它的唯一方法是通过代码中的方法,而不是来自用户输入。 (通常通过模型上的update_attributes来分配。)
你需要做的是在models / chapter.rb中添加:线索到attr_accessible。
您可能还想添加:线索 - 我认为它实际上应该给您错误:线索受到保护。您可能会遇到以下问题:clue_ids。无论它说什么都受到保护,只需在该模型中加入attr_accessible方法,您就应该能够从用户输入中更新它。