【RubyOnRails】format.jsが呼ばれない, respond_to内のreturnについて
//
問題
タイトルがうまくまとめられていませんが、、
非同期による処理をwebページ上で行いたく、js経由でコントローラのupdateアクションを呼ぼうとしています。その途中でsave
失敗時などに処理を中断したいなと思いたち、を下の様なコードを書きました。
# hoge_controller.rb def update if (予期しない入力がある、save失敗など) respond_to do |format| format.js{ @status = "fail" render ajax_redirect_to(root_path) # 非同期でリダイレクトする独自メソッド return # ここに挟んでみた } format.html{ flash[:danger] = I18n.t("events.update.danger.category") redirect_to(root_path) # htmlはこれをすれば処理を抜けるはず } end end # ここから正常処理を行う。 .... .... end
しかしこれでは、format.js
は呼ばれません。(おそらくhtmlも呼ばれない)
解決
ブロック内にreturn
を挟むとその時点で、メソッドを抜けるとのこと。上のコードでは、そもそもformat.jsが呼ばれる前にupdate
から抜けてしまっているのが原因ですね。下の様に直しました。respond_to
の外にreturn
を設置。無事期待通りの動きになりました。
# hoge_controller.rb def update if (予期しない入力がある、save失敗など) respond_to do |format| format.js{ @status = "fail" render ajax_redirect_to(root_path) # 非同期でリダイレクトする独自メソッド } format.html{ flash[:danger] = I18n.t("events.update.danger.category") redirect_to(root_path) # htmlはこれをすれば処理を抜けるはず } end return # ここに移動 end # ここから正常処理を行う。 .... .... end