railsチュートリアル第七章 flash


flash

ユーザー登録フォームが実際に動くようになった。
それにより登録することができるよになった。
登録完了後に表示されるメッセージを二度目以降に表示させないようにさせる。
それを使うには
flashという変数を使う。 ハッシュのように使う。

ユーザー登録ページにフラッシュメッセージを追加する

app/controllers/users_controller.rb

class UsersController < ApplicationController
.
.
.
  def create
    @user = User.new(user_params)
    # 外部メソッドを使う
    if @user.save
      # 保存の成功をここで扱う。
      flash[:success] = "Welcome to the Sample App!"
      # 成功時一度だけ表示されるメッセージ
      redirect_to @user
      # urlを指定して表示する
      # 保存成功したらurlを表示する
    else
      render 'new'
      # 保存に成功しなければnewアクションに移動する
      # 失敗したらまた戻る
    end
  end

  private
  #外部から使えないようにする

    def user_params
    # Usersコントローラの内部でのみ実行される
    # Web経由で外部ユーザーにさらされない
       params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end
>> flash = {success: "It worked!", dager: "It failed." }
# ハッシュを作った。
=> {:success=>"It worked!", :dager=>"It failed."}
>> flash.each do |key, value|
# each文を作成 繰り返し
?>   puts "#{key}"
>>   puts "#{value}"
>> end
success
It worked!
dager
It failed.

:successキーのメッセージが表示される場合、適用されるCSSクラスは次のようになります。

alert-success

flash変数の内容をWebサイトのレイアウトに追加する

app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  <head>
    <title><%= full_title(yield(:title)) %></title>
    <%= render 'layouts/rails_default' %>
    <%= render 'layouts/shim' %>
  </head>
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
        <!--これがデータ送信成功時メッセージのためのHTML-->
        <!--message_typeにsuccess代入, message 成功時メッセージに代入-->
      <% end %>
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
      <!--デバッグ情報はRailsの3つのデフォルト環境のうち、開発環境(development)だけで表示されるようになります-->
    </div>
  </body>
</html>

演習

1.コンソールに移り、文字列内の式展開(4.2.1)でシンボルを呼び出してみましょう。例えば"#{:success}"といったコードを実行すると、どんな値が返ってきますか? 確認してみてください。

>> "#{:success}"
=> "success"

2.先ほどの演習で試した結果を参考に、リスト 7.28のflashはどのような結果になるか考えてみてください。

>> flash
=> {:success=>"It worked!", :dager=>"It failed."}
#ハッシュのキーとバリュー
>> "#{flash[:success]}"
#ハッシュのキーでバリューを呼び出す
=> "It worked!"
>> "#{flash[:dager]}"
=> "It failed."