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_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
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字段始终返回空白,而常规设计字段,用户名和电子邮件将被填写.这是否也可以轻松修复?如果是这样,怎么样?
有人帮助我以一种更“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" %>
再次感谢你的帮助。我知道在没有看到整个代码库的情况下很难回答这样的问题。
| 归档时间: |
|
| 查看次数: |
3007 次 |
| 最近记录: |