Rails Rails 的自定 Helper 方法的作用域问题

wjeasys · 2016年08月19日 · 最后由 wjeasys 回复于 2016年08月19日 · 2435 次阅读

我现在使用的是 Rails 5.0.0.1 和 Ruby 2.3.1p112。 在使用自定义 helper 的方法时遇到一个作用域不清晰的问题。 我在 articles_helper.rb 中定义了如下方法:

module ArticlesHelper
    def trunk
    return "hello world ArticlesHelper"
  end
end

在 welcome 文件夹下的 index_html.erb 中定义如下:


<html>
    <h1>Hello, WelcomeIndex</h1>
    <h1><%= trunk%></h1>
</html>

在 articles 文件夹下的 new_html.erb 中定义如下:


<html>
    <h1>Hello, ArticlesNew</h1>
    <h1><%= trunk%></h1>
</html>

运行结果如下:

然后我在网上搜索资料,在 Wiki 库里看到一篇文章,是这么描述的:

想请问 rails 能做到一个 helper 对应一个 view 吗?其中定义的方法只在这一个 view 中生效,而不是作为全局的方法。

看看 Rails MVC 里用来打造 View 的模版。在默认情况下,这些 Helper 允许我们从 View 抽取出代码,抽出来不过是一堆函数!这些函数甚至存在于同一个 Namespace 下面。噢,惊讶了吗?感到恐惧了吗?正是像 PHP 那样呢! 但我认为 PHP 在单一函数之间,很少需要互动这点上事对的,就像 View 有着许多的抽象一样。根据这个目的,单一的 Namespace,一堆的方法,这不只是个合理的决定,还是很棒的决定。 - The Rails Doctrine

https://ruby-china.org/wiki/the-rails-doctrine#多元化的设计模式

可以定义到 controller,然后用 helper_method :method_name 将这个方法声明为 helper。

http://apidock.com/rails/AbstractController/Helpers/ClassMethods/helper_method

@huacnlee 刚学习,还不是很明白 rails 这种设计的原则,我现在的理解是定义在 helper 中的方法是全域方法,无论是写在那个 helper 文件里,view 都是可以使用; 谢谢@Rei ,这样定义可以满足我的需求了,在 ArticlesController 定义方法声明为 helper 后,只能在这个 controller 对应的 view 中使用,在 ApplicationController 定义的话,就可以全局使用了。

#3 楼 @wjeasys 我自己用的话会给 helper 加上前缀避免冲突,例如 topics helper module 里面的方法都是 topic_method_name

#3 楼 @Rei 嗯,谢谢,这样也可以,从书写格式上去规范和避免冲突。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号