ログイン失敗時のエラー表示がうまくいきません。具体的な流れは、
SessionsController#newでモーダルダイアログを表示
↓
失敗時はAjaxでフォームにエラー内容を表示
簡略化して該当箇所を示します。
- sessions/new.js.erb(application.html.erbは省略)
js
1$("#login-modal").html("<%= escape_javascript(render 'sessions/login_form') %>") 2$("#login-modal").modal("show")
- sessions/_login_form.html.erb(post "/login", to: "sessions#create")
html
1<div class="modal-dialog"> 2 <div class="modal-content"> 3 <%= form_for(:session, url: login_path, remote: true, html: { id: "login-form" }) do |form| %> 4 5 <div id="error-explanation" class="hide"> 6 <div id="error-alert" class="alert alert-danger"></div> 7 <div id="errors"><ul/></div> 8 </div> 9 10 <!-- フォーム(省略) --> 11 12 <%= form.submit "ログイン" %> 13 <% end %> 14 </div> 15</div> 16
- sessions_controller.rb(create.js.erbは空)
ruby
1class SessionsController < ApplicationController 2 3 def create 4 @user = User.find_by(email: params[:session][:email]) 5 if @user && @user.authenticate(params[:session][:password]) 6 # ログイン処理(省略) 7 else 8 render json: { errors: ["メールアドレスまたはパスワードが間違っています。"] }, status: 422 9 end 10 end 11 12end
- sessions.coffee
coffeescript
1$(document).on "turbolinks:load", -> 2 3 $("#login-form").on "ajax:error", (e) -> 4 $("#error-explanation").removeClass("hide").show() 5 errors = e.detail[0].errors 6 7 #(以下略)
status code: 422、content-type: application/jsonで{"errors":["メールアドレスまたはパスワードが間違っています。"]}とresponseが来ますが、"ajax:error"イベントが発火しません。(alertで確認済み)
似たような機構で新規登録は実装できたので、モーダルダイアログが原因なのかとも思いましたが、原因が分かる方ご教授お願いします。
あなたの回答
tips
プレビュー