147
92

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

flashとflash.nowの違いを検証してみた

Last updated at Posted at 2019-03-16

タイトルの通りです。

使用環境:

ruby:2.5.1
rails:5.2.2

検証

こんなコードを書きました。

blogs_controller.rb
  def create
    @blog = Blog.new(blog_params)
    if @blog.save
      redirect_to blogs_path
    else
      flash[:notice] = '投稿に失敗しました'
      render :new
    end
  end

ブログを投稿し、バリデーションにひっかかると投稿に失敗しましたというメッセージを出します。

このコードだと、こんな動きをします。
まず、投稿画面から。
スクリーンショット 2019-03-16 17.56.18.png

わざとバリデーションエラーを発火させる。
予定通り、flashメッセージが表示される。
スクリーンショット 2019-03-16 17.55.27.png

ここで、画面にあるBackをクリックしてみる。
スクリーンショット 2019-03-16 17.55.38.png
フラッシュメッセージが出たままだ!

新規登録画面に遷移したら、ようやく消えた。
スクリーンショット 2019-03-16 18.23.47.png

続いて、コードを以下のように変更します。

blogs_controller.rb
  def create
    @blog = Blog.new(blog_params)
    if @blog.save
      redirect_to blogs_path
    else
      flash.now[:notice] = '投稿に失敗しました'
      render :new
    end
  end

同じくわざとバリデーションエラーを発火させ、Backを押下。
するとflashメッセージが消えた!
スクリーンショット 2019-03-16 18.17.04.png

しくみ

flash[:notice]にすると、次のアクションまで表示させる。
flash.now[:notice]にすると、次のアクションに移行した時点で消える。
スクリーンショット 2019-03-16 18.37.00.png
renderは指定したviewsを呼び出すだけなので、アクションではないから気をつけるべし!
redirect_toは次のアクションになるので、flash.nowだと表示すらしない。

147
92
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
147
92

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?