翻译自: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 函数啦。
感谢阅读。