翻译自:https://www.rubyguides.com/2020/01/rails-helpers/api
在 Rails 中,Helper 是指什么?ruby
Helper 是一个函数(多数时候),用于 Rails 视图之间,共享可复用的代码。Rails 内置一组 Helper 函数。app
其中一个是 time_ago_in_words
。less
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"
这个函数,用于显示指定格式的日期。ide
另外一个用于 Rails 视图的 Helper 函数是 number_to_human
。函数
number_to_human(10_000) # "10 Thousand"
当你想要将数字显示为可读的形式时,这个函数颇有用。学习
你能够在 Rails 文档中,找到更多的内容:https://api.rubyonrails.org/ui
那么,该如何定义本身的 Helper 函数呢?this
若是你要编写 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 函数,在你的视图中。
像这样:
<%= format_name(@user) %>
很简单,对吧?
若是你想在视图之外的地方使用这些 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 终端(加载了 Rails app 环境的 irb) 来使用函数和其余一些东西。
你能够在终端中使用 helpers,经过 helper.method_name
。
注意 helper
的单数形式,不然会收到错误消息。另外,记住终端下,当你修改了代码后,它不会从新加载。
那么,什么时候建立 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 函数啦。
感谢阅读。