Ruby on rails 如何使用另一个助手的助手?

Ruby on rails 如何使用另一个助手的助手?,ruby-on-rails,Ruby On Rails,我想从其他帮助程序中清楚地引用帮助程序函数。include是一种方式,但这会造成名称空间的混乱 有没有一种方法可以使用助手的完整名称空间来引用它? 有没有办法用文件夹和名称空间组织帮助程序代码? 在Rails中,帮助程序只是视图上下文中包含的模块。视图上下文是Rails传递给ERB的内容,它在视图中充当隐含的自我 您可以简单地引用助手中其他助手的方法,因为它们都被扔进同一个包中 # app/helper/foo.rb module FooHelper def foo_helper_metho

我想从其他帮助程序中清楚地引用帮助程序函数。include是一种方式,但这会造成名称空间的混乱

有没有一种方法可以使用助手的完整名称空间来引用它? 有没有办法用文件夹和名称空间组织帮助程序代码?
在Rails中,帮助程序只是视图上下文中包含的模块。视图上下文是Rails传递给ERB的内容,它在视图中充当隐含的自我

您可以简单地引用助手中其他助手的方法,因为它们都被扔进同一个包中

# app/helper/foo.rb
module FooHelper
  def foo_helper_method
    "oof morf olleH"
  end
end

# app/helpers/bar.rb
module BarHelper
  def bar_helper_method
    foo_helper_method.reverse
  end
end
这是因为当您在视图中调用foo\u helper\u方法时,它是在self上调用的。self是视图上下文,它已经包括FooHelper和BarHelper

由于Rails 4,app/helpers中的每个文件都包含在视图上下文中

帮手是铁轨上臭烘烘的腋窝。对于视图来说,所有复杂的垃圾代码都会在这里结束。所有的方法都包含在同一个对象中,所以从定义一组全局方法开始,这基本上只是一个进步,至少它们在某种程度上是封装的。它很简单,可以让您完成工作并编写真正简洁的视图。如果你需要更复杂的东西,那么助手就不是你想要的

该问题的一个常见解决方案是decorator/view-model/presenter模式。但这也带来了相当大的复杂性

有没有一种方法可以使用助手的完整名称空间来引用它

否。辅助对象仅包含在视图上下文中。这只是一个模块混合。不是魔法。如果要在助手中声明仅从其他助手使用的方法,可以将其声明为模块方法:

module AdminHelper
  def self.some_method
  end
end

module AdminHelper
  def self.some_method
  end
end

# app/helpers/bar.rb
module BarHelper
  def bar_helper_method
    AdminHelper.some_method
  end
end
但在本例中,self是模块本身,而不是视图上下文,因此如果您试图在单例模块方法中使用其他帮助器方法而不传入视图上下文,则会遇到问题

有没有办法用文件夹和名称空间组织帮助程序代码

对。Rails将自动查看应用程序/帮助程序的子文件夹,并包含找到的每个模块


但这并不能真正帮助您避免命名冲突,因为它们都包含在同一对象中。如果两个模块定义了相同的方法,那么最后一个模块包含了wins。

由于rails 4所有帮助程序现在都加载到旧版本rails的视图中,所以您可以从另一个帮助程序引用/使用另一个帮助程序方法。