[譯] 在 Rails 中使用 Flash Message(即時信息)

(本文翻譯自:https://www.rubyguides.com/2019/11/rails-flash-messages/ruby

什麼是即時信息?ide

即時信息是即時信息是一種將信息顯示給你的 Rails 網站用戶的一種方式,用於告訴他們發生了什麼事。函數

示例:佈局

  • 密碼被修改(確認提示)
  • 用戶沒有找到(錯誤信息)

即時信息每每在 Controller 中設置即時信息,而後再視圖中渲染出來。你的用戶獲得所須要的信息。學習

讓咱們來學習它如何工做。網站

如何使用即時信息

你能夠經過使用 flash 助手函數,來發起提示信息。ui

他們用起來很像 Ruby hash。翻譯

即時信息對象具備像 keysany?,或者 each 這種方法,要訪問即時信息,則是使用 []code

那麼,你能夠設置哪些類型的的消息呢?對象

默認狀況下,你能夠設置:

  • notice
  • alert

這是一個使用例子:

flash.alert = "User not found."

另外一種風格:

flash[:alert] = "User not found."

(二者只是風格不一樣)

你可使用這些代碼,在你的 Controller Actions 中,好比 indexcreatenew 之類的。

另外一種使用方式:

redirect_to :books_path, notice: "Book not found"

這容許你在一步中,重定向頁面和建立即時消息。

這很棒呦!

Alert 對比 Notice

據我瞭解,alert 或者 notice 具體使用哪一個,不是很重要。哪一個用着合適,就用哪一個。

我習慣使用 alert 顯示錯誤信息,使用 notice 顯示一些提示信息。

二者主要仍是風格的區別。

舉個例子

你能夠將 alert 顯示爲紅色,將 notice 顯示爲綠色。

你也能夠根據須要,在控制器中,使用 add_flash_types,來建立你本身的消息類型。

像這樣:

class ApplicationController
  add_flash_types :info, :error, :warning
end

我喜歡保持簡單,因此內置的消息類型已經足夠我用啦。

渲染即時信息

即時信息不會自動顯示,你必須在你的視圖上渲染他們,而後才能看到。您能夠考慮將他們添加到佈局視圖上

這是代碼:

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

這這句代碼放在你想顯示它們的地方,一般是放在頁面頂端,菜單欄下面。

記住:

即時消息只會顯示一次,而後就會被移除,不會再顯示。

美化你的即時消息

即時消息默認沒有內置樣式。

若是你使用 Bootstrap,你能夠將 alert alert-info CSS 類添加到即時消息上,它們會看起來好看不少。

例子:

<% flash.each do |type, msg| %>
  <div class="alert alert-info">
    <%= msg %>
  </div>
<% end %>

若是你沒有使用 Bootstrap,你能夠根據你的需求,自定義通知的樣式。

什麼時候須要顯示即時消息?

即時消息被顯示出來後,將在控制器下一次動做時被移除。

根據這個特性,作一個總結:

  • 若是你調用 redirect_to,並顯示出 flash hash 中的即時消息,那麼一切正常
  • 若是你調用 redirect_to,但並無顯示出即時消息,那麼消息仍然保存在 flash hash 中
  • 若是你在設置消息到 flash hash 同一個 action 中顯示即時消息,那麼 flash 消息會被顯示出來,可是 flash 中的消息不會被刪除,因此它會被顯示兩次。

因此……

該如何在當前的 action 中顯示即時消息呢?

flash.now 閃亮登場。

這是一個例子:

def index
  @books = Book.all
  flash.now[:notice] = "We have exactly #{@books.size} books available."
end

這將在 index 視圖渲染出即時消息。

notice 中的內容將被顯示,隨即就被刪除掉,使用這種方式,消息不會被顯示兩次。

因此,當你想要使用 render 而不是重定向頁面的時候,你須要使用 flash.now 來進行消息顯示。

總結

在本文中,你學習到了關於 Rails 中,有關即時消息的知識,以及如何正確使用它。

最後,須要注意的是,即時消息與錯誤驗證之間的區別。錯誤驗證是與模型對象有關的,你須要使用模型的 errors 方法,來訪問有關驗證錯誤的信息,好比 @user.errors

如今是時候去寫一些代碼,來實踐在本文中學到的知識啦。

感謝閱讀。

相關文章
相關標籤/搜索