Rails – flash

概要

flashはFlashHashクラスのインスタンスで、エラーなどのメッセージを遷移後の画面に表示するときに使う。ハッシュの様に状態キーに対するメッセージを登録するが、リクエストごとにクリアされる(Railsガイド)。

たとえばエラーメッセージの表示に使う手順は以下のとおり。

  1. バリデーションや保存処理などの結果に応じて、flashをセット
    • flash[状態キー] = "メッセージ"
  2. リダイレクト後の画面でflashを参照し、状態キーに応じたメッセージを表示

基本動作

前提

たとえば以下の例ではform_with@userの名前(:name)を入力して、ユーザー名が英数6文字以内であることを要求している。

app/views/flash_test.html.erb

モデルのバリデーションで、ユーザー名の長さと構成文字の検証を行う。

  • ユーザー名は6文字以上
  • ユーザー名に使える文字は英数字のみ

app/models/user.rb

flashへの登録

通常はバリデーションはデータベースへの書き込み時に行われるが、ここではvalid?でバリデーションを強制している。

検証の結果が適正であればflashに:successのキーで「適正な入力」、不適正であれば:dangerのキーで「不適正な入力」のメッセージを登録している。

その後、結果によらず最初のページを表示するアクションへリダイレクト(リダイレクト先のページは任意だが、ここでは最初のページにしている)。

app/controllers/pages_controller.rb

flashに対応した表示

リダイレクト/レンダリング後のビューに、flashの結果に応じた表示を行うコードを追加する。

app/views/flash_test.html.erb

flashのキー・値のセットの分だけeachで取り出して表示するが、その際にキーに応じたクラスを設定している。

そのレンダリング結果を確認してみよう。

遷移前のページでの入力が適正だった場合は、コントローラーでflash:successをキーとして「適正な入力」のメッセージ文字列が渡される。このとき、キーの内容(:success)を使ってクラス設定が行われる。

一方、入力が不適正だった場合にはコントローラーでflash:dangerをキーとするメッセージが渡され、それがレンダリングされた結果は以下のとおり。

この結果、遷移前のページでのバリデーション結果に応じた表示が行われる。

スタイルの変化

動的なクラス設定に対するスタイル

先のコードで、入力の結果に応じてメッセージのクラスが動的に設定された。スタイルファイルでそれらのクラスに応じたスタイルを定義することで、結果に応じた変化をつけることができる。

以下のスタイルファイルは、flashの結果セットされたクラスに応じてメッセージの色に変化をつけている。

処理の概要は以下のとおり。

  1. flashによる通知全般のスタイル設定
    .notice
  2. flashのキー(:success/:danger)に応じてセットされたクラスによって色を変化させる
    &_success/&_danger

<実行結果>

以下はバリデーションエラーの場合で、適正な場合は「適正な入力」と表示される。

ダイアログ表示

flashの内容を遷移後のページの表示前にダイアログで表示する場合、application.html.erbhead部分にJavaScriptを記述。

app/views/layouts/application.html.erb

処理の概要は以下のとおり。

  1. headブロックでダイアログ表示のスクリプトを定義
  2. flashがセットされている場合にダイアログを表示
  3. ダイアログのメッセージに、flashのすべてのメッセージを改行で結合して表示

<実行結果>

:dangerのときだけダイアログを表示する場合は以下の様になる。

has_key?を使うため、to_hashflashをハッシュに変換している。ただし、to_hashでハッシュに変換するとキーがシンボルではなく文字列になる点に注意。

一定時間後に表示を消す

flashに応じて表示されたメッセージを一定時間後に消すには、JavaScriptを使う。application.html.erbに以下の様に書く。

app/views/layouts/application.html.erb

処理の概要は以下のとおり。

  1. 必要に応じてJQueryを読み込む
  2. bodyの最初(最上部)にメッセージ表示エリアを定義
  3. 一定時間表示させた後にスライドアップで表示を消すスクリプトを定義
    1. $(".notice").slideUp()でメッセージをスライドアップ消去
    2. 1.5秒後に消去を実行するよう、window.setTimeoutにコールバックとして渡す

なお、:success:dangerによって表示の色を変える設定をCSSに書いている。

 

<実行結果>

以下、danger/successに応じた表示で、1.5秒後にこれらの表示がスライドアップされて消去される。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です