У меня есть форма входа с использованием gem bcrypt. Он работает, как ожидалось, в консоли рельсов. Однако я получаю эти ошибки на сайте. Любая помощь будет очень признательна.
NoMethodError в ManagersController # loginattempt undefined method `authentication 'for true: TrueClass
Я прочитал несколько сообщений SO - я использовал, внес исправления, которые они не разрешают ошибка:
Например - это потому, что класс аутентификации не имеет префикса 'self', это предложение фактически нарушает рабочую функциональность в терминале @some_user.authenticate('***********') => true
def authenticate(password)
self.password_hash == BCrypt::Engine.hash_secret(password, password_salt)
end
or
def self.authenticate(password)
self.password_hash == BCrypt::Engine.hash_secret(password, password_salt)
end
or
def self.authenticate(password)
password_hash == BCrypt::Engine.hash_secret(password, password_salt)
end
Модель
class Manager < ApplicationRecord
attr_accessor :password
validates :username, presence: true, uniqueness: true
validates :password, presence: true, on: :create
before_validation(on: :create) do
encrypt_password
end
def authenticate(password)
password_hash == BCrypt::Engine.hash_secret(password, password_salt)
end
private
def encrypt_password
self.password_salt = BCrypt::Engine.generate_salt
self.password_hash = BCrypt::Engine.hash_secret(password, password_salt)
end
end
Контроллер - выдает ошибки.
class ManagersController < ApplicationController
...
def loginattempt
@manager = Manager.where(manager_params).exists?
if @manager && @manager.authenticate(manager_params)
redirect_to managers_path, notice: 'You are logged in.'
else
redirect_to manager_login_path, notice: 'Username or Password incorrect.'
end
end
private
def manager_params
params.require(:manager).permit(:username, :password)
end
end
Для потомков я считаю, что теперь это работает, как и ожидалось - спасибо сообществу SO за помощь мне в мой час нужды. Рабочий контроллер
def loginattempt
@manager = Manager.find_by_username(manager_params[:username])
if @manager.present? && @manager.authenticate(manager_params[:password])
redirect_to manager_logged_in_path(@manager), notice: 'Logged In.'
session[:logged_in] = @manager.id
else
redirect_to manager_login_path, notice: 'Username or Password incorrect.'
end
end