[译] 在 Rails 中使用 Flash Message(即时信息)

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

什么是即时信息?

即时信息是即时信息是一种将信息显示给你的 Rails 网站用户的一种方式,用于告诉他们发生了什么事。

示例:

  • 密码被修改(确认提示)
  • 用户没有找到(错误信息)

即时信息往往在 Controller 中设置即时信息,然后再视图中渲染出来。你的用户得到所需要的信息。

让我们来学习它如何工作。

如何使用即时信息

你可以通过使用 flash 助手函数,来发起提示信息。

他们用起来很像 Ruby hash。

即时信息对象具有像 keysany?,或者 each 这种方法,要访问即时信息,则是使用 []

那么,你可以设置哪些类型的的消息呢?

默认情况下,你可以设置:

  • 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

现在是时候去写一些代码,来实践在本文中学到的知识啦。

感谢阅读。


胡说八道
一些 Web 开发方面的技术文章,有翻译,有原创
1.9k 声望
743 粉丝
0 条评论
推荐阅读
[译] 一个 Rails 开发者眼中的 Hanami
我还记得第一次听说 Hanami 框架的时候,是几年前,在 Wroclove.rb 会议的时候。当时并没有真正引起我的关注,那时我刚刚进入 Ruby 世界,正 100% 专注于学习 Rails,我不想在大脑认知上,接收另一个框架的信息。

shiweifu阅读 2.5k

浅谈基于Web的跨平台桌面应用开发
近些年来,跨平台跨端一直是比较热门的话题,Write once, run anywhere,一直是我们开发者所期望的,跨平台方案的优势十分明显,对于开发者而言,可以做到一次开发,多端复用,一套代码就能够运行在不同设备上,...

京东云开发者2阅读 375评论 1

Electron 的 GUI 和 Ruby 的 CLI 的一种交互实践
在一个中大型的客户端研发团队中,会使用诸如 Ruby、Shell、Python 等脚本语言编写的脚本、命令行和 GUI 工具来完成各项任务。比如 iOS、Android 开发人员想在一台新电脑上开发一个新 App ,那么需要先在本地配置...

云音乐技术团队1阅读 359

封面图
gitlab 如何进入控制台
使用下面的命令: {代码...} 然后随便玩吧 {代码...}

ponponon阅读 1.1k

火山引擎推出基于全新视角的 Web 端性能监控方案
背景“异常感知——发现根因——解决问题”,基于该理念,火山引擎APM团队设计了高可用易扩展的SDK和消费平台,形成了一种面向Web监控的解决方案,该方案紧密关联了各个功能,足以支撑复杂场景下的性能、异常数据消费和...

字节跳动终端技术1阅读 1.1k

封面图
GO web 开发 实战二,数据库相关
xdm 上次有分享到GO web 开发 中 http 包中的简单方法使用,最后还有一个 模板 , 在这里补充一下直接上案例模板我们在 main.go 里面写一个 服务端的 demo,使用模板来将冬天的数据写入到 html 文件中对应的需要...

阿兵云原生阅读 791

封面图
GO 语言 Web 开发实战一
xdm,咱今天分享一个 golang web 实战的 demogo 的 http 包,以前都有或多或多的提到一些,也有一些笔记在我们的历史文章中,今天来一个简单的实战HTTP 编程 Get先来一个 小例子,简单的写一个 Get 请求拿句柄设...

阿兵云原生阅读 787

封面图
1.9k 声望
743 粉丝
宣传栏