[译] 如何使用 Rails Helper

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

在 Rails 中,Helper 是指什么?ruby

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

其中一个是 time_ago_in_wordsless

例子

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 函数

若是你要编写 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 函数啦。

感谢阅读。

相关文章
相关标签/搜索