3

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

感谢阅读。


shiweifu
2k 声望744 粉丝