无法使用Devise批量分配受保护的属性以创建has_many嵌套模型

Kyl*_*son 8 ruby-on-rails mass-assignment nested-attributes devise ruby-on-rails-3

我已经看过RailsCast,另一个嵌套属性视频,很多SO帖子,并与此争吵了一段时间,但我仍然无法弄明白.我希望它有点小.

我有两个型号,User(通过制定创建),和Locker(又名,产品心愿),和我试图创建Locker一个User用户注册时.我的登录表单有一个字段,用于表示新的Locker(适当调用的:name)我正在尝试分配给在新用户注册时创建的锁定器.我所遇到的只有:

WARNING: Can't mass-assign protected attributes: locker

我试过的每个组合accepts_nested_attributesattr_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
Run Code Online (Sandbox Code Playgroud)

# 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
Run Code Online (Sandbox Code Playgroud)

我假设我需要覆盖Devise的create方法以某种方式让它工作,但我对rails很新,并且我已经习惯了黑盒子"神奇"的本质.

如果有人能帮助我,我会非常感激.已经花了太多时间在这上面,因为它是:)

编辑:我意识到我在我的问题中省略了一些东西.我的Locker模型有三个属性- ,name(description非强制),并user_id把它回链接User.我的注册表单只需要name,所以我不会遍历嵌套表单中的所有属性.这可能与我的问题有关吗?

编辑2:我也想出了如何覆盖Devise的RegistrationsController#create方法,我只是不知道该放什么.Devise的整个resource事情对我来说没有意义,浏览他们的源代码RegistrationsController也没有帮助我.

并且对于奖励积分:当用户使用无效数据提交登录表单时,该Locker字段始终返回空白,而常规设计字段,用户名和电子邮件将被填写.这是否也可以轻松修复?如果是这样,怎么样?

Kyl*_*son 2

有人帮助我以一种更“Rails 4'y”的方式找出解决方案strong attributes以及如何覆盖 Devise 的sign_up_params(以捕获来自我的注册表单的所有数据)。

  def sign_up_params
    params.require(:user).permit(:username, :email, :password, :lockers_attributes)
 end
Run Code Online (Sandbox Code Playgroud)

Gemfile 添加:gem 'strong_parameters'

注释掉attr_accessible我的user.rb文件中的语句,因为显然强大的参数消除了声明的需要attr_accessible

 # attr_accessible :username, :email, :password, :password_confirmation, :lockers
Run Code Online (Sandbox Code Playgroud)

以及在提交表单之前构建 Locker 的正确方法:在嵌套表单的开头:

<%= l.input :name, :required => true, label: "Locker name", :placeholder => "Name your first locker" %>

再次感谢你的帮助。我知道在没有看到整个代码库的情况下很难回答这样的问题。