从另一个视图调用帮助器

时间:2009-12-17 01:53:10

标签: ruby-on-rails

我知道如果我想调用另一个控制器的帮助器,我可以做类似的事情:

helper :other_controllers

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

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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