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.rbbefore_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个主要问题,当我仅保存用户编辑表单而不做任何改变:

  1. 错误显示:“工作人员通知电子邮件已经采取”(我在Staff模型validates :notification_email, uniqueness: true, allow_nil: true
  2. 错误显示: “工作人员的项目不能为空”(我有validates_presence_of :project_idStaff模型)
  3. 即使我收到的2个错误,与user相关的staff模型被歼灭,所有的属性都设置为nil除了notification_email。这包括user_id字段,因此staff对象不再连接到user

回答

1

这些嵌套的属性,所以你需要添加它们在下列方式:

devise_parameter_sanitizer.for(:sign_up) { |u| 
    u.permit(:username, :staff_attributes => [:name, :position, :etc]) 
} 
+0

哇,这是令人惊讶的。我在''permit'调用中添加了:',staff_attributes:[:notification_email]'。因为我只希望用户能够更新他们的'notification_email',如果他们是职员。结果发生的是所有其他字段,包括'Staff'的'user_id'字段被设置为'nil'!所以用户不再是职员!有没有办法只能更新一个员工属性?或者至少不把所有其他领域设置为“无”?另外,当我编辑用户时,我得到一个错误,即需要另一个'staff'字段,尽管它仍然没有全部字段。 –

+1

问题是我没有':id'作为'staff_attributes'指向的数组中的一个元素。现在一切正常完美! –

+0

太棒了,我很高兴它的作品! – arnvald