めもめも のーと

ハマったこととか、覚えたこととか

[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] でした。訂正してお詫び申し上げます。。