deviseで実装したログイン機能が昨日はできていたのに何故か今日になってからログインできなくなりました。
ログインが失敗するとエラーメッセージを表示したかったのでコントローラーをカスタマイズしました。(カスタマイズしたのは一昨日です)
sessions_controller.rb
def new @user = User.new end def create @user = User.find_by(email: params[:email], password: params[:password]) if @user redirect_to :root else @error_message = "メッセージ" @email = params[:email] @password = params[:password] render "devise/sessions/new" end end
上記のコードでやるとメールアドレスとパスワードは絶対合っているのにエラーメッセージが出てログインできなくなります。
def new @user = User.new end def create @user = User.find_by(email: session_params[:email], password: session_params[:password]) if @user redirect_to :root else @error_message = "メッセージ" @email = params[:email] @password = params[:password] render "devise/sessions/new" end end private def session_params params.permit(:email, :password) end end
必要か分からないのですが、privateを付け足してみましたが、結果は同じでした。
find_byでif @user.saveにしてみたらノーメソッドエラーになります。(saveがnilになります)
find_byをcreateやnewに変えて、if @user.saveにしたらルートに遷移はされるのですが、
ログインはしていない状態になります。
ちなみにビューはこのようになっています。
.aaa %h2 ログイン = form_for(user_session_path) do |f| - if @error_message .message = @error_message .field = f.label :email %br/ = f.email_field :email, autofocus: true, autocomplete: "email", class: "bbb" .field = f.label :password %br/ = f.password_field :password, autocomplete: "current-password", class: "ccc" - if devise_mapping.rememberable? .field = f.check_box :remember_me = f.label :remember_me .actions = f.submit "ログイン", class: "ddd"
これはdeviseを作成してからほとんど触っていません。
上から6行目までと各フィールドのクラス名のみ触りました!
昨日はこの記述でもログインできていたと思うのですが…原因が分からないので、ご回答よろしくお願いします。
#補足
ログインビューの2行目を
= form_for(resource, as: resource_name, url: session_path(resource_name)) do |f|
と変えてみました。
ログインボタンを押すと
ArgumentError in Users::Sessions#create First argument in form cannot contain nil or be empty
エラー出るのですが、エラー出た後に
= form_for(user_session_path) do |f|
に戻すと何故かエラーがなくなり、再度ログインするとログイン出来るようになりました。
しかし、再びログアウトをするとログインは出来なくなっています。
こう言う現象は何故でしょうか?
コントローラー、ビューの記述自体はほぼ問題なさそうでform_forに問題ありそうな気がしています。。。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。