Предупреждение о массовом назначении при использовании вложенных атрибутов в Devise

У меня проблемы с вложенными атрибутами и Devise. Проблема аналогична Как использовать вложенные атрибуты с разработать модель. Насколько я могу судить, у меня все настроено в соответствии с рекомендациями здесь: контроллер

Я настроил ассоциации для пользователей и подписок, у меня есть "accepts_nested_attributes_for", и я включил :subscriptions_attributes в attr_accessible, но получаю предупреждение от контроллера 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"=>"99@99.     com"}}
WARNING: Can't mass-assign protected attributes: subscription

Я пытался использовать subscription_attributes (единственное число) в attr_accessible, но это не сработало.

Любые предложения о том, что я могу делать неправильно? Спасибо.


person stupakov    schedule 14.05.2011    source источник
comment
Вы пытались установить attr_accessible :subscription?   -  person ecoologic    schedule 15.05.2011
comment
@ecoologic - это дает ошибку unknown attribute: subscription в Devise::RegistrationsController#create. Также попробовал attr_accessible :subscriptions, но получил исходную ошибку.   -  person stupakov    schedule 15.05.2011


Ответы (1)


Поскольку у вас есть ассоциация has_many между вашей моделью User и Subscription, я считаю, что вам нужно указать 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 будут затем переданы с использованием параметра subscribes_attributes, который должен работать, поскольку у вас есть attr_accessible :subscriptions_attributes.

Дополнительные примеры вложенных форм ассоциации has_many см. в разделе «Примеры вложенных атрибутов» (один ко многим) документа Документация по Rails.

person mbreining    schedule 15.05.2011
comment
Да, это так, тогда, используя accept_nested_attributes_for :subscriptions, вам даже не нужно проверять @user.save, чтобы сохранить @subscriptions в вашем контроллере! - person ecoologic; 15.05.2011
comment
Спасибо - получилось. Первоначально я думал, что fields_for :subscriptions был неправильным, потому что поля формы подписки не отображались. Однако это произошло потому, что subscriptions не был инициализирован Devise::RegistrationsController. Как предложено в stackoverflow.com/questions/3546289/, мы можем создать в представлении resource.subscriptions. Однако я думаю, что это относится к контроллеру, и теперь у меня проблема с этим: " title="вложенная модель недоступна в представлениях разработки"> stackoverflow.com/questions/6005932/. - person stupakov; 15.05.2011