Я смотрел 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 всегда возвращается в исходное состояние, в то время как заполняются поля, имя пользователя и адрес электронной почты. Может ли это также быть легко исправлено? Если да, то как?