我看过 RailsCast,另一个嵌套属性视频,很多 SO 帖子,并为此奋斗了一段时间,但我仍然无法弄清楚。我希望它是微小的东西。
我有两个模型,User
(由 Devise 创建)和Locker
(又名产品愿望清单),我正在尝试在他们注册时创建Locker
一个。User
我的登录表单有一个字段,用于填写他们的新名称Locker
(恰当地称为: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
方法才能以某种方式让它工作,但我对 rails 很陌生,并且已经习惯了它的黑匣子“魔法”性质。
如果有人可以帮助我,我将非常感激。已经在这上面花了太多时间了:)
编辑:我意识到我在我的问题中遗漏了一些东西。我的Locker
模型具有三个属性 - name
,description
(不是强制性的),并将user_id
其链接回User
. 我的注册表单只需要name
,所以我没有遍历嵌套表单中的所有属性。这也与我的问题有关吗?
编辑 2:我还想出了如何覆盖 Devise 的RegistrationsController#create
方法,我只是不知道该放什么。设计的整个resource
事情对我来说没有意义,浏览他们的源代码对RegistrationsController
我也没有多大帮助。
并且对于奖励积分:当用户提交带有无效数据的登录表单时,该Locker
字段总是返回空白,而常规的设计字段,用户名和电子邮件,被填写。这也可以很容易地解决吗?如果是这样,怎么做?