iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

今晚我想來點 Ruby on Rails 系列 第 14

<Day 14>在 rails 如何使用 Flash Messages

  • 分享至 

  • xImage
  •  

什麼是 flash messages?

Flash message 是一個訊息可以讓使用者與 rails 溝通,這樣使用者可以從 flash messages 得知在 action 產生的結果。例如:

“Password changed correctly” (confirmation)
“User not found” (error)

將這些 flash messages 設定在 controller 然後 render 在 views 裡面,使用者就可以依據裡面的訊息知道發生了什麼事,是欄位沒填或者其他原因。

如何使用 Flash Messages

可以使用 flash helper method 來操作 flash messages,看起來就像是 Ruby hash , flash 物件有一些方法可以使用像是 keys, any? 或 each 可以使用 [] 來存放想給使用者看到的訊息。

可以設定哪些類型的 flash messages ?

根據預設會有:

  • notice
  • alert

使用範例:

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 vs Notice

目前為止使用 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 不會自動在畫面出現,必須要把建立好的 flash messages render 到畫面裡,這樣使用者才可以看得到。

<% flash.each do |type, msg| %>
  <div>
    <%= msg %>
  </div>
<% end %>

將這段程式碼放到想要讓使用者看到的地方,同常會是在畫面的頂端,請記住,渲染的訊息會被 flash 移除,所以不會出現第二次。

設計 Notices & Alert Messages 樣式

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 。


上一篇
<Day 13>如何在 ruby on rails 使用 AJAX
下一篇
<Day 15>attr_reader, attr_writer, attr_accessor
系列文
今晚我想來點 Ruby on Rails 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0

請問 render中的 type參數是什麼?一定要寫作「type」嗎?謝謝

我要留言

立即登入留言