0

我正在尝试通过 Ruby on Rails 4.0 学习和使用我自己的用户模型和身份验证,但大多数教程(如果不是全部)似乎在最近的更新中已经过时了。它们中的任何一个都没有描述的方法有效。我绝对一无所知,这是我的用户模型:

class User
  include Mongoid::Document
  field :login, type: String
  field :hash, type: String
  field :salt, type: String
  field :email, type: String
  field :name, type: String

  before_save :hash_password

  validate :login, presence: true, uniqueness: true, length: { in: 4..24 }
  validate :password, presence: true, confirmation: true, length: { in: 8..32 }
  validate :email, presence: true
  validate :name, presence: true

  def hash_password
    if password.present?
      self.salt = BCrypt::Engine.generate_salt
      self.hash = BCrypt::Engine.hash_secret(password, salt)
    end
  end
end

和控制器:

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
    else
      render 'new'
    end
  end

  def new
    @user = User.new
  end

  private
    def user_params
      params.require(:user).permit(:login, :password, :password_confirmation, :email, :name)
    end
end

然后,UnknownAttribute当我保存用户时出现错误。我错过了什么?哪些字段有误?

4

3 回答 3

1

您需要添加:

attr_accessor :password

现在您正在尝试使用密码属性,但 rails 对此一无所知。attr_accessor允许您在本地使用密码属性,但不会将其持久化到数据库中(这很好)。

于 2013-11-04T06:32:54.867 回答
1

您可以关注铁路演员剧集。我知道它有点旧,但几个月前我也使用过它,对于 rails 4,您可以简单地“允许”属性而不是使用“attr_accessible”,因为 rails 4 不支持 attr_accessible。

于 2013-11-04T06:41:03.990 回答
1

我设法使它工作。我没有弄清楚“未知属性”错误是怎么回事,但是我更改了模型以使用方法has_secure_password,它自动获取我的:password:password_confirmed参数,bcrypts 并保存到:password_digest字段。

class User
  include Mongoid::Document
  include ActiveModel::SecurePassword # important, imports has_secure_password
  field :login, type: String
  field :password_digest, type: String
  has_secure_password
  field :email, type: String
  field :name, type: String

  validate :login, presence: true, uniqueness: true, length: { in: 4..24 }
  validate :password, presence: true, confirmation: true, length: { in: 8..32 }
  validate :email, presence: true, uniqueness: true
  validate :name, presence: true
end

完成后,我收到以下错误:

can't activate bcrypt-ruby (~> 3.0.0), already activated bcrypt-ruby-3.1.2. Make sure all dependencies are added to Gemfile.

尽管 bcrypt 已正确添加到我的 Gemfile 中,但显然has_secure_password需要特定版本的 gem 3.0.x,所以我强制它:

gem 'bcrypt-ruby', '~> 3.0.0'

这下载了按预期工作的版本 3.0.1(不是 3.0.0)。我希望他们尽快修复此版本的不兼容问题。

感谢所有的答案。当我完成时,这个项目将是开源的 :)

于 2013-11-05T02:57:58.303 回答