Railsでログインページを作っていました。
bcyrptのGemを使って作ろうとしたのですが、正しいメールアドレス・パスワードを登録し、ログインしようとしても「ログインに失敗しました」と表示され、なかなかできず…
#環境
Rails 5.2.4.4
DB:SQLite
#問題のあったコード
・gemfileにてcryptをインストール済み
・userモデルに has_secure_password を定義
・usersテーブルに password_digest:string を追加
users_controller.rb
class UsersController < ApplicationController
def sign_in_process
user = User.find_by(email: params[:email])
if user && user.authenticate(params[:password])
user_sign_in(user)
flash[:success] = 'ログインしました'
redirect_to products_path
else
flash[:danger] = 'ログインに失敗しました'
redirect_to sign_in_path
end
end
end
user_sign_in(user)の部分はhelperで、
users_helper.rb
def user_sign_in(user)
session[:user_id] = user.id
end
と書いています。
#解決方法
paramsの後に[:user]を追加しました
users_controller.rb
class UsersController < ApplicationController
def sign_in_process
user = User.find_by(email: params[:user][:email])
if user && user.authenticate(params[:user][:password])
user_sign_in(user)
flash[:success] = 'ログインしました'
redirect_to products_path
else
flash[:danger] = 'ログインに失敗しました'
redirect_to sign_in_path
end
end
end
ログを見るとSQL文にメールアドレスがNULLと表示され、paramsの中にデータが入っていませんでした。
そのため、paramsの後に[:user]と書き、userモデルのemailカラム、passwordカラムに対応するようにしました。