【发布时间】:2014-03-14 08:37:13
【问题描述】:
我正在从 Rails 3.2 升级到 4.0,并且正在为我的 User 模型使用 Devise。以前我的User 模型中有attr_accessible 属性:
attr_accessible :username, :first_name, :last_name, :email, :password, :password_confirmation, :remember_me
现在根据Devise documentation for strong parameters,我必须在application_controller.rb 的before_filter 方法中执行以下操作:
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :first_name, :last_name, :email, :password, :password_confirmation, :remember_me) }
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :current_password) }
看起来不错,但我的User 模型中也有一个accepts_nested_attributes_for:
accepts_nested_attributes_for :staff, reject_if: :new_record?
如何在我的devise_parameter_sanitizer.for(:account_update) 中指定它?我不清楚。
更新:我尝试了以下方法:
devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :first_name, :last_name, :email, :password, :password_confirmation, :remember_me, :current_password, staff_attributes: [:notification_email]) }
特别是,我在permit 方法中添加了staff_attributes: [:notification_email] 作为参数。当我简单地保存用户编辑表单而不进行任何更改时,发生了 3 个主要问题:
- 显示错误:“员工通知电子邮件已被接收”(我在
Staff模型中有validates :notification_email, uniqueness: true, allow_nil: true) - 显示错误:“员工项目不能为空”(我在
Staff模型中有validates_presence_of :project_id) - 即使我收到了这 2 个错误,与
user关联的staff模型也被清除了,所有属性都设置为nil,除了notification_email。这包括user_id字段,因此staff对象不再连接到user。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 devise strong-parameters