web-dev-qa-db-ja.com

Rails 4:フラッシュメッセージは次のページビューのために持続します

レイアウトで次のコードを使用して、2種類のフラッシュメッセージを表示しています。

    <% if !flash[:notice].nil? %>
    <div class="row">
        <div class="flash notice col-xs-12">
            <%= flash[:notice] %>
        </div>
    </div>
    <% end %>
    <% if !flash[:error].nil? %>
    <div class="row">
        <div class="flash error col-xs-12">
            <%= flash[:error] %>
        </div>
    </div>
    <% end %>

    <%= debug(flash[:notice]) %>
    <%= debug(flash[:error]) %>

どちらも正常に機能しますが、いずれかがトリガーされると、1つの追加ページビューで表示されます。キャッシングジェムを使用していません。

なんでこんなことが起こっているの?そして、どうすれば修正できますか?

28
emersonthis

flashの代わりにflash.nowを使用してください。

flash変数はredirectの前に使用することを目的としており、1つのリクエストに対して結果のページに保持されます。つまり、redirectではなく、単にページをrenderした場合、flashメッセージは2つのリクエストに対して持続します。レンダリングされたページに表示されますが、まだ待機中です。リダイレクト(つまり、2番目のリクエスト)の場合、リンクをクリックするとメッセージが再び表示されます。

この奇妙な動作を回避するために、リダイレクトではなくレンダリングする場合、flashの代わりにflash.nowを使用します。

flash.nowオブジェクトは、レンダリングされたページにflashメッセージを表示するために使用されます。私の仮定によると、予期しないランダムなflashメッセージを見つけた場合は、flashflash.nowに置き換えることで解決できます。

お役に立てば幸いです:)

57