Rails 4 has_secure_password

时间:2013-03-13 04:16:23

标签: ruby-on-rails-4

在Rails 4应用程序中 - 尝试在我的控制台中创建一个简单的用户时出现此错误。

RuntimeError:
   Password digest missing on new record

我的模型,控制器和架构如下所示:

class User < ActiveRecord::Base # User.rb
  has_secure_password
end

class UsersController < ApplicationController 

  def new
    @user = User.new
  end

 def create
   @user = User.new(user_params)
     if @user.save
       redirect_to root_path, notice: "Thank you for signing up!"
     else
      render "new"
    end
  end

private

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

create_table "users", force: true do |t| #db/schema.rb (edited for brevity)
  t.string   "email"
  t.string   "name"
  t.text     "password_digest"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我正在使用postgresql,我不确定这是一个错误,还是我错过了一些简单的东西。

谢谢,

3 个答案:

答案 0 :(得分:2)

在Rails 4中,所有属性都默认为大量分配,因此您不需要使用attr_accesible。现在你必须说明你想保护哪些。你会这样写的

attr_protected :admin

当password_digest为空时,会出现错误。它可能与你的attr_accesor有关:我可以看到你的观点吗?

答案 1 :(得分:1)

我是在 rails 4

中完成的

要使用“has_secure_password”,您必须使用参数password_digest

Schema Information = name :string, password_digest :string

class User < ActiveRecord::Base
     has_secure_password
     validates :name, presence: true, uniqueness: true
     validates_presence_of :password, :on => :create
end

和控制器

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

def create
    @user = User.new(user_params)
    respond_to do |format|
      if @user.save
        format.html { redirect_to users_url, notice: "User #{@user.name} was successfully created.'"}
        format.json { render action: 'show', status: :created, location: @user }
      else
        format.html { render action: 'new' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
end

答案 2 :(得分:1)

我遇到了同样的问题,但这部分解决了我的问题。无法存储 password_confirmation ,因为它不是许可参数

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