简体   繁体   中英

Rails NoMethodError: undefined method `password_digest=

I am new to rails and have seen all possible answers for my problem, as this is asked quite frequently by other developers, yet I'm unable to resolve it. Please have a look.

I am getting this error when I try to add a data from the console

User.create(name: "Michael Hartl", email: "mhartl@example.com", phone: "0123456789", password: "foobar", password_confirmation: "foobar")

ERROR SHOWN

undefined method `password_digest=' for #<User:0x0000000375c788>
Did you mean?  password=

Controller

 def create
    @candidate = User.new(user_params)
    if @candidate.save
      flash[:notice] = "New Candidate Added Successfully"
      redirect_to(users_path)
    else
      render('new')
    end
  end

  private

    def user_params
      #Whitelisting for strng parameters
      params.require(:user).permit(:name, :email, :password, :password_confirmation, :qualification, :college, :stream, :phone)
    end

Migration:

class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :name, null: false
      t.boolean :admin_user, default: false
      t.string :email, null: false
      t.string :password_digest, null: false
      t.string :qualification
      t.string :college
      t.string :stream
      t.string :phone
      t.timestamps
    end
  end
end

Model

require 'bcrypt'
class User < ApplicationRecord
    include BCrypt
    has_many :results, dependent: :destroy
    has_many :exams, through: :results
    accepts_nested_attributes_for :results

    VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

    before_save { self.email = email.downcase }

    has_secure_password

    validates :email, presence: true
    validates :email, presence: true, length: { maximum: 255 },format: { with: VALID_EMAIL_REGEX },uniqueness: { case_sensitive: false }
    validates :password, presence: true, length: { minimum: 6 }
    validates_confirmation_of :password
    validates_presence_of :password_confirmation
    validates :name, presence: true
    validates :phone, numericality: {only_integer: true}, length: {is: 10 , message: "length should be 10"} 

    scope :visible, lambda { where(:visible => true) }
    scope :invisible, lambda { where(:visible => false) }
    scope :sorted, lambda { order("id ASC") }
    scope :newest_first, lambda { order("created_at DESC") }
    scope :search, lambda {|query| where(["name LIKE ?", "%#{query}%"]) }


end

Have you checked this https://github.com/plataformatec/devise/issues/1845

As per described in the issue, you are using ActiveModel's has_secure_password with Devise. You must not mix the two.

May be removing has_secure_password from User model will resolve your issue.

The code was completely fine,

few server restarts and don't really know how but restarting my code editor ( Visual Studio Code ) worked for me.

I am leaving the question as it is, as I did reach to this code after going through several stackoverflow threads.

NB: For newbies like me, please see how to check for errors while inserting into database from console, it helps a lot. Synatctical example is as:

rails c

user = User.new ( ... . . . . .. )
user.save
user.errors

Thankyou

This happened to me as well, and I found out that sometimes vscode doesn't actually kill the process running. You will need to kill rails from the terminal. use ps aux | grep rails ps aux | grep rails to find out what processes are running and use kill -9 [rails-pid] to stop the process. On your next attempt, everything should work fine. This answer helped me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM