【问题标题】:'Unknown attribute' error in controller控制器中的“未知属性”错误
【发布时间】:2014-10-05 16:19:47
【问题描述】:

我想做自己的简单身份验证。 所以我做了用户模型和用户控制器。我有一个注册表格 我的用户控制器的一部分。

  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

还有错误:

未知属性:密码

在我的用户表中,每个用户都有usernamepassword_digest。所以没有像password这样的列。

我刚刚看过 Rails Cast 插曲,但它是关于 Rails 3 的,作者使用 attr_accessible,但我在 Rails 4 中读到我们应该使用强参数。

我该如何处理?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4


    【解决方案1】:

    您可能正在使用has_secure_password,但您没有正确启用它。 has_secure_password 为您的模型添加了两个虚拟属性:passwordpassword_confirmation。错误未知属性可能意味着您的模型上没有正确设置这两个属性。

    在任何情况下都不应将password_digest 作为参数传递,因为 BCrypt 和 has_secure_password 使用此列来计算密码属性的散列版本。换句话说,它与表单无关。

    确保你有:

    1. 在您的 gemfile 中包含 BCrypt gem
    2. 正确地将has_secure_password 模块包含在您的用户模型中。

    您对strong_parameters 的使用是正确的。问题出在您的模型中,可能与 has_secure_password 相关,而不是 strong_paramters。所以这行是正确的:

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

    【讨论】:

    • 谢谢 :) 我在 has_secure_password 方法中有错字。
    【解决方案2】:

    强参数过滤参数以避免大量分配,直到它们被列入白名单。

    permit 方法标识了允许的参数列表,并且必须与模型的属性相对应。

    所以,在你的情况下,你应该写

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

    【讨论】:

    • 但是我可以从用户那里获得一些自定义属性吗?在 Rails 3 中,我认为通过 attr_accessible 您可以获得与模型不对应的参数。还是我错了?
    • 这个答案是错误的。首先,他不应该通过password_digest。这是 Rails 存储密码属性的计算哈希的地方。此处导致错误的密码属性是通过 has_secure_password 包含的虚拟属性。在任何情况下,他都不应该通过表格传递它。事实上,这个属性根本不应该被触及。它完全是内部的。
    • @Mohamad :我建议通过 :password_digest 因为 OP 说这是他在 User 模型中的属性名称。
    • @FredPerrin 错误与强参数无关。这是一个未知的属性错误。换句话说,他正在设置用户不存在的属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多