問題
タイトルがうまくまとめられていませんが、、
非同期による処理を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