[译] 如何使用 Rails Helper

翻译自:https://www.rubyguides.com/2020/01/rails-helpers/

在 Rails 中,Helper 是指什么?

Helper 是一个函数(多数时候),用于 Rails 视图之间,共享可复用的代码。Rails 内置一组 Helper 函数。

其中一个是 time_ago_in_words

例子

time_ago_in_words(Time.now)
# "less than a minute"

time_ago_in_words(Time.now + 60)
# "1 minute"

time_ago_in_words(Time.now + 600)
# "10 minutes"

这个函数,用于显示指定格式的日期。

另一个用于 Rails 视图的 Helper 函数是 number_to_human

例子:

number_to_human(10_000)
# "10 Thousand"

当你想要将数字显示为可读的形式时,这个函数很有用。

你可以在 Rails 文档中,找到更多的内容:https://api.rubyonrails.org/

那么,该如何定义自己的 Helper 函数呢?

编写自己的 Helper 函数

如果你要编写 Helper 函数,正确的路径是 app/helpers,然后将你的 Helper 函数,写在其中的 helper module 中。

每个 Rails 应用,默认都带了基础的 helper module,命名为 ApplicationHelper。这里就是存放你 helper 函数的地方。

只要在模块中写好 helper 函数,那些函数在视图中,将自动变的可用。稍后将为你展示如何在 Controller 中使用它们,以及为什么这是个坏点子。如果你愿意,你可以在 ApplicationHelper 中写一切 helper 函数,但还有更好的组织方法。你可以创建一个你自己的文件,用来存储相关 helper 函数。

步骤

  • app/helpers 中,创建新文件
  • 命名为 user_helper.rb
  • 添加同名新的模块

示例

# app/helpers/user_helper.rb
module UserHelper
  def format_name(user)
    if user.gender == "M"
      "Mr. #{user.name}"
    else
      "Ms. #{user.name}"
    end
  end
end

这段代码可以被用于需要根据姓名来格式化用户姓名的地方。

这样做的好处?

当你需要使用这段逻辑的时候,你不需要在每次用到的时候,都重复。此外,当你需要修改这段逻辑的时候,你也只需要修改一次。

这很好。

使用你的新 Helper 模块

你可以使用你刚定义的 Helper 函数,在你的视图中。

像这样:

<%= format_name(@user) %>

很简单,对吧?

如果你想在视图以外的地方使用这些 Helper 函数,还有些工作要做。

如何在 Controller 中使用 Helper 函数

在控制器中,使用 Helper 函数,是可以实现的,只是这种用法不太常见。

在 Rails 5 之前,你必须引入 Helper 模块。

在 Rails 5 之后的版本,你可以通过调用在 Controller 中,调用 helpers(注意复数形式)对象来使用。

像这样:

class UsersController
  def index
    helpers.time_ago_in_words(Time.now)
  end
end

你可以通过这种方式,在 Controller 中来使用 Helper 函数,不过你要仔细想清楚是否要这么做,有这种需求可能是设计有问题。

考虑使用一个普通的 Ruby 对象代替。

在 Rails Console 中,使用 Helper 函数

我喜欢使用 Rails 终端(加载了 Rails app 环境的 irb) 来使用函数和其他一些东西。

而 Helper 对象被引入了!

你可以在终端中使用 helpers,通过 helper.method_name

注意 helper 的单数形式,否则会收到错误消息。另外,记住终端下,当你修改了代码后,它不会重新加载。

编写 Rails 视图函数的最佳实践

那么,何时创建 Helper 函数呢?

在你需要在 HTML 中,使用一些包含逻辑的时候。

通常,这种情况下,可以分为两类需求,一类是字符串处理,一类是根据条件生成页面元素。

其他建议

如果你像写出符合最佳实践的帮助函数,那你不应该使用实例变量,实例变量也许对你某一个视图有用,但有可能另一个视图用不到。

这时,就会因为缺少变量,而返回错误信息。

解决方案

将需要的用到的外部变量,通过参数进行传递,这样会让你的 Helper 函数清晰而明确

# wrong way
def eat_healthy
  @fruit.eat
end
# do this instead
def eat_healthy(fruit)
  fruit.eat
end

我最后的建议是,将你的 Helper 函数,根据不同功能,放在不同的模块文件中。然后给这些模块起一个有描述性的名称,这样就使相关代码一目了然。

然而……

编写 Helper 函数的时候,要注意函数名唯一,避免重名,否则会报冲突的错误。

另一个选择是,使用

另一个选择是,使用  presenter objects, 这里进行演示

总结

在本文中,你学习了有关 Rails Helper 函数的一些知识。Helper 函数是一组函数的集合,在视图中进行调用。用于处理在诸如格式化文本、抽象复杂展示逻辑这类问题。

现在,是时候编写你自己的 Helper 函数啦。

感谢阅读。


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

shiweifu阅读 2.3k

汽车行业场景化营销新方向:基于 WebGL 的网上虚拟车展
车展作为车市的风向标,代表着汽车发展的趋势,也是厂商展示自己、推广自己的舞台。WebGL 作为一种新兴的技术,为 Web 端提供了交互式三维动画新体验,汽车之家的网上车展就是两者结合之后的一种新的产品形态。

之家技术阅读 4.8k

封面图
SpringMVC-ResponseBodyAdvice
ResponseBodyAdvice接口可以在将handler方法的返回值写入response前对返回值进行处理,例如将返回值封装成一个与客户端约定好的对象以便于客户端处理响应数据。本篇文章将学习如果使用ResponseBodyAdvice以及其实...

半夏之沫2阅读 4.3k

前端脚手架开发入门
脚手架是一个通用开发工具,之前自己写一下原生web工程时总是需要重复搭建开发环境、重复写几乎相同的配置文件。为了避免每次的重复工作,统一开发环境、规范,于是想到自己写一个脚手架用用,顺便记录一下。

coderLeo1阅读 427

封面图
SpringMVC-RequestMappingHandlerMapping
使用SpringBoot进行web开发时,控制器类由@RestController注解修饰,通常@RestController注解与@RequestMapping配合使用,被修饰的类用于处理由DispatcherServlet分发下来的web请求。那么当一个web请求到达时,Di...

半夏之沫2阅读 1.8k

SpringMVC-RequestMappingHandlerAdapter
在SpringMVC-RequestMappingHandlerMapping中对web请求到来时如何获取处理该请求的handler进行了分析,那么获取到web请求对应的handler之后,SpringMVC框架还会根据handler获取其对应的HandlerAdapter,handler的...

半夏之沫1阅读 1.4k

web系统添加盲水印
为增加系统安全性,避免重要敏感信息通过截图方式泄露,对web页面增加盲水印标识,标注系统名称,登陆人,当前时间等信息,这里的盲水印指肉眼不可见的html水印

code2roc阅读 889

1.9k 声望
743 粉丝
宣传栏