Rails 3 railscast#196,3次循环不工作

时间:2012-05-16 04:55:09

标签: ruby-on-rails-3 railscasts

我发现了很多关于这个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 

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

提前感谢您的时间

2 个答案:

答案 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方法,您就应该能够从用户输入中更新它。