从另一个视图调用帮助器

gmo*_*iey 1 ruby-on-rails

我知道如果我想调用另一个控制器的助手,我可以这样做:

helper :other_controllers
Run Code Online (Sandbox Code Playgroud)

但我想知道为什么我不能在视图中做像OtherControllersHelper.method这样的事情?

EmF*_*mFi 5

由于Rails加载模块的方式,您无法在不进行修改的情况下执行此操作.

Rails将关联的帮助器模型包含在用于呈现模板的ActionView :: Base实例中.ActionController :: Helpers #helper(在上面的示例中使用)将更多辅助模块添加到要包含的辅助模块列表中.视图中使用的辅助方法被编写为实例方法.Ruby中的模块没有提供任何好的方法来获取实例方法而不使用构造函数.这是将模块与类分开的重要事项之一.

要使用just从另一个控制器访问助手OtherControllersHelper.method,您需要将方法重新定义为类方法.但是,将这些方法重新定义为类方法会使它们无法从您的视图中访问.

您可以将助手中的所有实例方法复制为类方法,但这绝对不是添加的更好的解决方案helper :other_controllers.有方法可以实际定义包装器,但同样,它不是处理这种情况的最佳方法.

如果您有很多可能在多个控制器/视图中使用的帮助器,那么最好将它们放在其他地方.像app/helpers/application_helper.rb这样的地方.或者另一个辅助模块,只能在需要它的控制器中加载.