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