flash変数とは?
何かの処理を行った時に、「〜しました」のようなメッセージを表示させることが出来るものです。
これをうまく使いこなすことでユーザーの使いやすいアプリが作れます!
flash変数の基本的な使い方
flashはハッシュのような形式で記述します。キー名は自分の好きな名前をつけることができます。
# flash[:キー名] = "表示させたいメッセージ"
flash[:success] = '写真を投稿しました'
noticeとalertオプション
あらかじめnoticeとalertというオプションが用意されています。
flash[:notice] = 'お知らせが2件あります' # 通知に使用する
flash[:alert] = 'ログインしてください' # 警告に使用する
flashメッセージが消えない時は、、
flash.nowというメソッドがあるのでそれを活用すれば良いです。
flash.now[:alert] = 'ログインしてください'
使えるテクニック集
###flash用の部分テンプレートを作る
「flash[:キー名] = "メッセージ"」の部分の「キー名」をmessage_typeで、「メッセージ」をmsgで取得できます。
<% flash.each do |message_type, msg| %>
<p class="alert alert-<%= message_type %>">
<%= msg %>
</p>
<% end %>
###redirect_toを使って短く記述する
# 書き方
if article.save
redirect_to path, flash: {キー名: "表字させたいメッセージ"}
else
~ 略 ~
end
# 例
if article.save
redirect_to path, flash: {success: "登録が完了しました"}
else
~ 略 ~
end
ちなみに、noticeとalertを使う時は非常に簡潔に記述することができます。
# 例
if article.save
redirect_to root_path, notice: "ログインに成功しました"
else
~ 略 ~
end
###renderメソッドを使うときのflash変数の使い方
flashメッセージはアクションが動いた時に表示され、次のアクションが動くと消去される仕組みになっています。
renderメソッドを使うときはアクションを通さないでビューファイルをレンダリングするため、次のアクションが動いた後にflashメッセージが表示されてしまいます。
renderの場合は表示された後、最初のアクションが実行されます。
flashメッセージは2回目のアクションが実行された時に削除されるため、2回flashメッセージが表示されてしまいます。
こういう場合もflash.nowを使用します。
# 例
if article.save
redirect_to root_path, notice: "登録が完了しました"
else
flash.now[:alert] = "名前を入力してください"
render :new
end
###flashメッセージを持ち越す方法
flash.keepを使うと指定されたフラッシュを次のアクションに持ち越すことができます。
#使い方
# 全てのflashメッセージが持ち越される
flash.keep
# 指定したキーのflashメッセージが持ち越される
flash.keep(:キー名)
# 例
private
def flash_keep
flash.now[:alert] = "名前を入力してください"
flash.keep(:alert)
end