2
我从Rails 3.2升级到4.0,并使用Devise for User
模型。以前我曾在我的User
模式attr_accessible
属性:根据Devise documentation for strong parameters允许在Rails 4中设计一个用户的嵌套属性4
attr_accessible :username, :first_name, :last_name, :email, :password, :password_confirmation, :remember_me
现在,我必须做好以下我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)
中指定?这点我不清楚。
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]) }
特别地,我添加staff_attributes: [:notification_email]
作为参数向permit
方法。发生了3个主要问题,当我仅保存用户编辑表单而不做任何改变:
- 错误显示:“工作人员通知电子邮件已经采取”(我在
Staff
模型validates :notification_email, uniqueness: true, allow_nil: true
) - 错误显示: “工作人员的项目不能为空”(我有
validates_presence_of :project_id
在Staff
模型) - 即使我收到的2个错误,与
user
相关的staff
模型被歼灭,所有的属性都设置为nil
除了notification_email
。这包括user_id
字段,因此staff
对象不再连接到user
。
哇,这是令人惊讶的。我在''permit'调用中添加了:',staff_attributes:[:notification_email]'。因为我只希望用户能够更新他们的'notification_email',如果他们是职员。结果发生的是所有其他字段,包括'Staff'的'user_id'字段被设置为'nil'!所以用户不再是职员!有没有办法只能更新一个员工属性?或者至少不把所有其他领域设置为“无”?另外,当我编辑用户时,我得到一个错误,即需要另一个'staff'字段,尽管它仍然没有全部字段。 –
问题是我没有':id'作为'staff_attributes'指向的数组中的一个元素。现在一切正常完美! –
太棒了,我很高兴它的作品! – arnvald