什麼是 flash messages?
Flash message 是一個訊息可以讓使用者與 rails 溝通,這樣使用者可以從 flash messages 得知在 action 產生的結果。例如:
“Password changed correctly” (confirmation)
“User not found” (error)
將這些 flash messages 設定在 controller 然後 render 在 views 裡面,使用者就可以依據裡面的訊息知道發生了什麼事,是欄位沒填或者其他原因。
可以使用 flash helper method 來操作 flash messages,看起來就像是 Ruby hash , flash 物件有一些方法可以使用像是 keys, any? 或 each 可以使用 [] 來存放想給使用者看到的訊息。
根據預設會有:
使用範例:
flash.alert = "User not found."
或者:
flash[:alert] = "User not found."
就只是撰寫風格不同而已,可以使用這個程式碼在 controller actions 像是 index 、 create 、 new 等等。
另一個使用方法:
redirect_to :books_path, notice: "Book not found"
這個方法可以在同一個步驟裡同時做到 redirect 跟建立 flash message 。
目前為止使用 alert 或 notice 好像都沒什麼分別。但還是盡量使用比較符合當下情境的語法。像是 alert 感覺起來是會有錯誤訊息而 notice 比較像是有確認訊息的通知(例如確認是否要刪除檔案)等等。舉個例子,可以在 alerts 使用紅色 & notices 使用綠色。
使用 add_flash_types controller method 也可以建立屬於自己的 flash types。
像是:
class ApplicationController
add_flash_types :info, :error, :warning
end
Flash messages 不會自動在畫面出現,必須要把建立好的 flash messages render 到畫面裡,這樣使用者才可以看得到。
<% flash.each do |type, msg| %>
<div>
<%= msg %>
</div>
<% end %>
將這段程式碼放到想要讓使用者看到的地方,同常會是在畫面的頂端,請記住,渲染的訊息會被 flash 移除,所以不會出現第二次。
Flash messages 沒有內建的樣式或設計。可以使用 Bootstrap ,
"alert alert-info" CSS class 讓 flash messages 看起來舒服一點。
<% flash.each do |type, msg| %>
<div class="alert alert-info">
<%= msg %>
</div>
<% end %>
如果不想使用 Bootstrap ,也可以撰寫 CSS 套用進去。
如果使用 redirect_to 然後渲染 flash message 這是很常見的做法,如果使用 redirect_to 但是不渲染 flash message 這個 message 就會一直停留在 flash hash。
如果使用在 action 那這個 flash message 還是可以使用但是不會被移除,直到下次被呼叫。
如果想要在現有的 action 建立 flash message 可以使用flash.now
:
def index
@books = Book.all
flash.now[:notice] = "We have exactly #{@books.size} books available."
end
這就可以渲染在 index view , notice message 會被 show 也會被 flash 移除,所以不會出現第二次。換句話說,如果只是要秀出訊息而不是換頁面那就只會需要用到 flash.now 。