【问题标题】:Mass assignment warning when using nested attributes with Devise将嵌套属性与 Devise 一起使用时出现质量分配警告
【发布时间】:2011-08-25 16:39:06
【问题描述】:

我在使用嵌套属性和设计时遇到问题。与How do I use nested attributes with the devise model 类似的问题。 据我所知,我已经按照这里的建议进行了所有设置: Override devise registrations controller

我已经为用户和订阅设置了关联,我有"accepts_nested_attributes_for",并在attr_accessible 中包含了:subscriptions_attributes,但我收到了来自设计控制器的警告。

class User < ActiveRecord::Base
    devise :database_authenticatable, :registerable,:recoverable, :rememberable, :trackable, :validatable
    validates_presence_of :first_name, :last_name
    has_many :subscriptions
    accepts_nested_attributes_for :subscriptions
    attr_accessible :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :subscriptions_attributes    
    ... 
end

--

class Subscription < ActiveRecord::Base
  belongs_to :user
  validates_presence_of :user_id, :chargify_subscription_id, :chargify_product_handle
  attr_accessible :user_id, :chargify_subscription_id, :chargify_product_handle
  ... 
end

设计/注册/new.html.erb:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
    <%= devise_error_messages! %>
    <p><%= f.label :first_name %><br />
      <%= f.text_field :first_name %></p>
    ...

    <%= f.fields_for :subscription do |s| %>
        <p><%= s.label :chargify_subscription_id %><br />
          <%= s.text_field :chargify_subscription_id %></p>
            ...

我收到以下警告:

Started POST "/users" for 127.0.0.1 at Sat May 14 12:38:49 -0700 2011
  Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"commit"=>"Sign up", "authenticity_token"=>"wNZhZgIhYm9CpZfhvDiRBqaJseoO8QvR0Mk9VIybhcI=", "utf8"=>"✓", "user"=>{"password_confirmation"=>"[FILTERED]",        "last_name"=>"9", "subscription"=>{"chargify_product_handle"=>"medium", "chargify_subscription_id"=>"123"}, "password"=>"[FILTERED]", "first_name"=>"9", "email"=>"99@99.     com"}}
WARNING: Can't mass-assign protected attributes: subscription

我尝试在attr_accessible 中使用subscription_attributes(单数),但这不起作用。

对我可能做错的任何建议? 谢谢。

【问题讨论】:

  • 你试过设置attr_accessible :subscription吗?
  • @ecoologic - 在Devise::RegistrationsController#create 中给出unknown attribute: subscription 错误。还尝试了attr_accessible :subscriptions,但得到了我原来的错误。

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


【解决方案1】:

由于您的 User 和 Subscription 模型之间存在 has_many 关联,我相信您需要指定 fields_for :subscriptions 而不是 fields_for :subscription

<%= f.fields_for :subscriptions do |s| %>
    <p><%= s.label :chargify_subscription_id %><br />
      <%= s.text_field :chargify_subscription_id %></p>
        ...

fields_for 范围内的属性将使用 subscriptions_attributes 参数传递,因为您有 attr_accessible :subscriptions_attributes,所以应该可以使用。

有关嵌套 has_many 关联表单的更多示例,请查看Rails documentation 的“嵌套属性示例”部分(一对多)。

【讨论】:

  • 是的,就是这样,然后使用accept_nested_attributes_for :subscriptions,您甚至不需要检查@user.save 以将@subscriptions 保存在您的控制器中!
  • 谢谢 - 做到了。我最初认为fields_for :subscriptions 是错误的,因为订阅表单字段没有被呈现。然而那是因为 subscriptions 没有被 Devise::RegistrationsController 初始化。正如stackoverflow.com/questions/3546289/… 中所建议的,我们可以在视图中构建resource.subscriptions。但是我认为这属于控制器,现在我遇到了问题:stackoverflow.com/questions/6005932/….
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多