Я смотрел RailsCast, еще одно вложенное видео атрибутов, много сообщений SO, и некоторое время боролся с этим, но я все еще не могу понять. Надеюсь, это что-то крошечное.
У меня есть две модели: User
(созданная Devise) и Locker
(aka, список желаний), и я пытаюсь создать Locker
для User
при регистрации. В моей регистрационной форме есть поле для имени их нового Locker
(aptly called :name
), которое я пытаюсь назначить шкафчику, который создается при новой регистрации пользователя. Все, с чем я когда-либо встречался, это:
WARNING: Can't mass-assign protected attributes: locker
Я пробовал каждую комбинацию accepts_nested_attributes
и attr_accesible
в обеих моделях, но пока ничего не работает. Я вижу из журналов, что он обрабатывается методом Devise # create, и я знаю, что Devise недостаточно умен, чтобы создавать мои модели, как я хочу:)
Здесь соответствующие биты двух моих моделей:
# user.rb
class User < ActiveRecord::Base
attr_accessible :username, :email, :password, :password_confirmation, :remember_me, :locker_attributes
# Associations
has_many :lockers
has_many :lockups, :through => :lockers
# Model nesting access
accepts_nested_attributes_for :lockers
end
и
# locker.rb
class Locker < ActiveRecord::Base
belongs_to :user
has_many :lockups
has_many :products, :through => :lockups
attr_accessible :name, :description
end
# lockers_controller.rb (create)
@locker = current_user.lockers.build(params[:locker])
@locker.save
Я предполагаю, что мне нужно переопределить метод Devise create
, чтобы как-то заставить это работать, но я совершенно новичок в рельсах и привык к черной "магической" природе всего этого.
Если кто-нибудь может мне помочь, я был бы невероятно благодарен. Уже потрачено слишком много времени на это, как есть:)
EDIT: Я понял, что я пропустил что-то в своей проблеме. Моя модель Locker
имеет три атрибута - name
, description
(не обязательно) и user_id
, чтобы связать ее с User
. Для моей регистрационной формы требуется только name
, поэтому я не перебираю все атрибуты в моей вложенной форме. Может ли это иметь отношение к моей проблеме?
EDIT 2: Я также выяснил, как переопределить метод Devise RegistrationsController#create
, я просто не знаю, что туда положить. Разработать целую resource
вещь для меня не имеет смысла, и просмотр исходного кода для RegistrationsController
тоже не помог мне.
И для бонусных очков: когда пользователь отправляет форму входа с недопустимыми данными, поле Locker
всегда возвращается в исходное состояние, в то время как заполняются поля, имя пользователя и адрес электронной почты. Может ли это также быть легко исправлено? Если да, то как?