セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【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も呼ばれない)

解決

qiita.com

ブロック内に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