将rails路由助手添加为类方法

时间:2013-07-23 16:34:14

标签: ruby-on-rails ruby routes

如何将像“root_path”这样的rails路由助手添加到像my_model.rb这样的类作为类方法

所以我的班级是这样的:

Class MyModel

  def self.foo
    return self.root_path
  end

end

MyModel.foo

上述方法不起作用,因为类MyModel不响应root_path

这就是我所知道的:

  1. 我可以使用include Rails.application.routes.url_helpers,但只将模块的方法添加为实例方法
  2. 我尝试过扩展Rails.application.routes.url_helpers,但无法正常工作
  3. 请随时上学我:)

1 个答案:

答案 0 :(得分:12)

通常不需要从模型访问URL路由。通常,您只需要在处理请求时或在渲染视图时(例如,如果您正在格式化链接URL)从控制器访问它们。

因此,您只需从控制器或视图中调用root_path,而不是向模型对象询问根路径。

修改

如果您只是对您无法将模块的方法作为类方法包含在类中的原因感兴趣,我不希望使用简单的include,因为这将包括模块的方法和你班上的实例方法一样。

extend通常会起作用,但在这种情况下,它并不是由于url_helpers方法的实现方式。来自actionpack/lib/action_dispatch/routing/route_set.rb来源

def url_helpers
  @url_helpers ||= begin
    routes = self

    helpers = Module.new do
...
      included do
        routes.install_helpers(self)
        singleton_class.send(:redefine_method, :_routes) { routes }
      end

包含included调用的routes.install_helpers(self)块表示您需要include模块才能安装方法(因此extend已经出局)。< / p>

如果在类上下文中调用extend,则以下内容应该有效。试试这个:

Class MyModel
  class << self
    include Rails.application.routes.url_helpers
  end
end
Class.root_path