レイアウトで次のコードを使用して、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つの追加ページビューで表示されます。キャッシングジェムを使用していません。
なんでこんなことが起こっているの?そして、どうすれば修正できますか?
flash
の代わりにflash.now
を使用してください。
flash
変数はredirect
の前に使用することを目的としており、1つのリクエストに対して結果のページに保持されます。つまり、redirect
ではなく、単にページをrender
した場合、flash
メッセージは2つのリクエストに対して持続します。レンダリングされたページに表示されますが、まだ待機中です。リダイレクト(つまり、2番目のリクエスト)の場合、リンクをクリックするとメッセージが再び表示されます。
この奇妙な動作を回避するために、リダイレクトではなくレンダリングする場合、flash
の代わりにflash.now
を使用します。
flash.now
オブジェクトは、レンダリングされたページにflash
メッセージを表示するために使用されます。私の仮定によると、予期しないランダムなflash
メッセージを見つけた場合は、flash
をflash.now
に置き換えることで解決できます。
お役に立てば幸いです:)