セキュリティ系の勉強・その他開発メモとか雑談. 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