2011-05-14 88 views
4

我遇到了嵌套屬性和設計問題。與How do I use nested attributes with the devise model類似的問題。 至於我可以告訴我已經把一切都設置爲在這裏推薦: Override devise registrations controller使用設計嵌套屬性時的質量分配警告

我已經設置了關聯的用戶和訂閱,我有"accepts_nested_attributes_for",並列入attr_accessible:subscriptions_attributes,但我得到Devise控制器的警告。

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"=>"[email protected]  com"}} 
WARNING: Can't mass-assign protected attributes: subscription 

我我已經嘗試在中使用subscription_attributes(單數)但這不起作用。

對於我可能會做錯的任何建議? 謝謝。

+0

您是否嘗試過設置'attr_accessible:subscription'? – ecoologic 2011-05-14 22:34:19

+0

@ecoologic - 在'Devise :: RegistrationsController#create'中給出一個未知屬性:訂閱錯誤。也嘗試'attr_accessible:訂閱',但得到我原來的錯誤。 – stupakov 2011-05-14 23:06:54

回答

5

由於您的用戶和訂閱模型之間有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的「嵌套屬性示例」部分(一對多)。

+0

是的,就是這樣,然後使用'accept_nested_attributes_for:subscriptions',你甚至不需要檢查'@ user.save'來在你的控制器中保存'@ subscriptions'! – ecoologic 2011-05-15 12:01:56

+0

謝謝 - 做到了。我原本以爲'fields_for:subscriptions'是錯誤的,因爲訂閱表單字段沒有得到渲染。不過那是因爲'訂閱'沒有被Devise :: RegistrationsController初始化。正如http://stackoverflow.com/questions/3546289/override-devise-registrations-controller/4527049#4527049中的建議,我們可以在視圖中構建resource.subscriptions。但是我認爲屬於控制器,現在我遇到了一個問題:http://stackoverflow.com/questions/6005932/nested-model-not-available-in-devise-views。 – stupakov 2011-05-15 18:02:53