2014-10-05 80 views
0

我想進行自己的簡單身份驗證。 所以我做了用戶模型和用戶控制器。我有一個註冊表格 我的用戶控制器的一部分。控制器中'未知屬性'錯誤

def create 
    @user = User.new(user_params) 
    if @user.save 
     redirect_to root_path, notice: "You've successfully singed up." 
    else 
     render 'new' 
    end 
    end 

    private 

    def user_params 
    params.require(:user).permit(:username, :password, :password_confirmation) 
    end 

和錯誤:

unknown attribute: password

在我的用戶表我有usernamepassword_digest爲每個用戶。所以沒有像password這樣的列。

我剛剛看過Rails Cast插曲,但它是關於Rails 3和作者使用attr_accessible,但我在Rails 4中讀過,我們應該使用強參數。

我該如何處理它?

回答

1

很可能你正在使用has_secure_password和你沒有正確啓用它。 has_secure_password爲您的模型添加了兩個虛擬屬性:passwordpassword_confirmation。錯誤未知屬性可能意味着這兩個屬性在模型上沒有正確設置。

在任何情況下,您都不應該將password_digest作爲參數傳遞,因爲BCrypt和has_secure_password使用此列計算密碼屬性的哈希版本。換句話說,它沒有任何形式的業務。

請確保您有:

  1. 包含在您的Gemfile
  2. 正確的BCrypt寶石包含在您的用戶模型的has_secure_password模塊。

您使用strong_parameters是正確的。問題出在你的模型上,可能與has_secure_password有關,而不是strong_paramters。因此,這條線是正確的:

def user_params 
    params.require(:user).permit(:username, :password, :password_confirmation) 
    end 
+0

謝謝:)我在'has_secure_password'方法中有一個錯字。 – Jensky 2014-10-05 16:59:38

0

強參數過濾參數,以避免質量分配,直到他們被列入白名單。

permit方法標識允許參數的列表,並且必須與您的模型的屬性相對應。

所以,你的情況,你應該寫

def user_params 
    params.require(:user).permit(:username, :password_digest) 
end 
+0

但我可以從用戶那裏得到一些自定義的屬性?在rails 3中,我認爲用'attr_accessible'可以得到不符合模型的參數。或者我錯了? – Jensky 2014-10-05 16:56:03

+0

這個答案是錯誤的。首先,他不應該傳遞'password_digest'。這是Rails從密碼屬性存儲計算出的散列的地方。在此導致錯誤的密碼屬性是通過has_secure_password包含的虛擬屬性。在任何情況下,他都不應該通過表格來傳遞。事實上,這個屬性絕對不應該被觸及。它完全是內部的。 – Mohamad 2014-10-05 16:56:09

+0

@Mohamad:我建議通過''':password_digest'''',因爲OP表示這是他在User模型中屬性的名稱。 – 2014-10-05 17:00:21

相關問題