The flash

註冊表單現在已經可以使用了。現在要增加一個歡迎訊息,如果連到其他頁面,或重整頁面,這個訊息必須消失。

Rails 提供一個 flash 方法用來顯示短暫的訊息,可以把它當作是一個 hash。Rails 會使用慣例的 :success key,表示執行成功時,會帶出你要的訊息:

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
    else
      render 'new'
    end
  end

  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

現在要走訪 flash,把相關訊息撈出來顯示在頁面上:

<% flash.each do |message_type, message| %>
  <div class="alert alert-<%= message_type %>"><%= message %></div>
<% end %>

其中:

alert-<%= message_type %>

是為各種訊息指定 CSS class,所以 :success 的訊息的 CSS class 就會是:

alert-success

:success key 是一個 symbol,ERb 會自動把它轉成字串 "success",然後再置入到 view 裡面。為不同的訊息類別指定 CSS class,可以各自幫這些訊息定義樣式。Bootsrap 提供四種樣式:success、info、warning、danger。

然後:

flash[:success] = "Welcome to the Sample App!"

輸出成 HTML 就會長這樣:

<div class="alert alert-success">Welcome to the Sample App!</div>

完整的程式碼如下:

app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
  .
  .
  .
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |message_type, message| %>
        <div class="alert alert-<%= message_type %>"><%= message %></div>
      <% end %>
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
    .
    .
    .
  </body>
</html>