trev9065
trev9065

Reputation: 3501

Rails 4 has_secure_password

In a Rails 4 app -- I am getting this error when trying to create a simple User in my console.

RuntimeError:
   Password digest missing on new record

My model, controller, and schema looks like:

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

I am using postgresql, and am not sure if this is a bug, or if I have missed something simple.

Thanks,

Upvotes: 3

Views: 7122

Answers (3)

DinizBr
DinizBr

Reputation: 11

I did it in rails 4:

for use "has_secure_password" you have to use the parameter 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

and the controller

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

Upvotes: 1

user3734485
user3734485

Reputation: 11

I had exact the same problem but that part here solved my problem. The password_confirmation could not be stored because it was not a permit parameter

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

Upvotes: 1

Richard Lau
Richard Lau

Reputation: 696

In Rails 4 all of the attributes are mass assigned by default so you don't need to use attr_accesible. Now you have to state which ones you want to protect. you would write it like this

attr_protected :admin

The error that you are getting gets raised when password_digest is blank. It probably has something to do with your attr_accesor:. Can I see your view?

Upvotes: 2

Related Questions