[rails]flashとflash.nowの違いの件
タイトルのままですが、ここで触れたので忘れないようにメモ。
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
たとえば下記のような場合にflashを使うと、エラーが出たページから別ページをrenderし、その後別のページへredirectなどで遷移した時に、flashのメッセージがそのまま引き継がれてしまいます。
原因は、 renderはリクエストとみなされない ためです。
def create ・・・ if @user.save! flash[:success] = 'Succeed saving user.' render 'index' else flash[:error] = 'Fail saving user' render 'new' end end
これを回避するのに、flash.now
を使います。
flash.nowであれば、同一リクエスト内で1回だけflashメッセージが表示されます。 従って、renderで遷移したあと、別ページ(正確には別action)へリダイレクトしたらflashメッセージは消えます。
□こう書く↓
def create ・・・ if @user.save! flash.now[:success] = 'Succeed saving user.' render 'index' else flash.now[:error] = 'Fail saving user' render 'new' end end
flash使うときは、renderにも気を付けましょうという備忘録。
参考: http://guides.rubyonrails.org/action_controller_overview.html#flash-now
2014/10/28 修正
flash[:success].now
と書いておりましたが、正しくは
flash.now[:success]
でした。訂正してお詫び申し上げます。。