【问题标题】:Rails 3.2 Can't mass-assign protected attributes: rRails 3.2 无法批量分配受保护的属性:r
【发布时间】:2012-05-21 03:13:00
【问题描述】:

我使用的是 Rails 3.2.X。这是一个 has_one 关系。

这里的一切似乎都搞定了:

class P < ActiveRecord::Base
  has_one :r
  accepts_nested_attributes_for :r
  attr_accessible :s, :r_attributes
end

class R < ActiveRecord::Base
  attr_accessible :a, :b, :c
  belongs_to :p
end 

表单发布的内容

"p"=>{"s"=>"5/6/2012", "r"=>{"a"=>"hello", "b"=>"world", "c"=>""}}

缩短的 P 形式:

<%= form_for(@p) do |f| %>
<%= render :partial => "r/form", :locals => { :p_form => f, :r => @p.r } %>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

缩短的 R 形式部分

<%= p_form.fields_for(r) do |fr| %>

如果我像这样创建 R.new(params[p][r]) 它工作正常。 如果我像这样创建 P.new(params[p]) 我无法为 R 批量分配受保护的属性(即使它独立工作) 您会注意到我已将 r_attributes 包含为可访问的。

下面指出的正确答案是

<%= promotion_form.fields_for(:r) do |fr| %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3.2


    【解决方案1】:

    【讨论】:

    • 很有趣,你是对的,但我使用的是 fields_for,它生成的是 r,而不是 r_attributes。为什么会这样?
    • 所以我认为你可以将 R 传递给 fields_for 表单。结果是带有前缀 r_attributes 的字符串文字是应该传递的。尽管从文档中看起来您可以传递一个对象,所以我不清楚为什么这首先不起作用。
    • 您的控制器中有@p.build_r 吗?如果是,您需要使用:p_form.fields_for :r do |fr|。我做了一个小例子:github.com/eicca/attrs_test/blob/master/app/views/customers/…。另外,参考这篇文章:railstic.com/2009/06/nested-object-forms-with-has_one-relation
    • 我的控制器中有@p.build_r。我首先有 p_form.fields_for p.r do |fr|。那没有用。于是我尝试了 p_form.fields_for :r do |fr|。那也不起作用(尽管现在是这样,所以我更新了答案以反映它)。当我将其切换为 :r_attributes ... 时,它起作用了。但我要切换回 :r
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 1970-01-01
    相关资源
    最近更新 更多