2014-10-05 74 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

相关问题