(本文翻譯自:https://www.rubyguides.com/2019/11/rails-flash-messages/)ruby
什麼是即時信息?ide
即時信息是即時信息是一種將信息顯示給你的 Rails 網站用戶的一種方式,用於告訴他們發生了什麼事。函數
示例:佈局
即時信息每每在 Controller 中設置即時信息,而後再視圖中渲染出來。你的用戶獲得所須要的信息。學習
讓咱們來學習它如何工做。網站
你能夠經過使用 flash
助手函數,來發起提示信息。ui
他們用起來很像 Ruby hash。翻譯
即時信息對象具備像 keys
,any?
,或者 each
這種方法,要訪問即時信息,則是使用 []
。code
那麼,你能夠設置哪些類型的的消息呢?對象
默認狀況下,你能夠設置:
這是一個使用例子:
flash.alert = "User not found."
另外一種風格:
flash[:alert] = "User not found."
(二者只是風格不一樣)
你可使用這些代碼,在你的 Controller Actions 中,好比 index
,create
,new
之類的。
另外一種使用方式:
redirect_to :books_path, notice: "Book not found"
這容許你在一步中,重定向頁面和建立即時消息。
這很棒呦!
據我瞭解,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
。
如今是時候去寫一些代碼,來實踐在本文中學到的知識啦。
感謝閱讀。