如何将像“root_path”这样的rails路由助手添加到像my_model.rb这样的类作为类方法?
所以我的班级是这样的:
Class MyModel
def self.foo
return self.root_path
end
end
MyModel.foo
上述方法不起作用,因为类MyModel不响应root_path
这就是我所知道的:
Rails.application.routes.url_helpers
,但只将模块的方法添加为实例方法Rails.application.routes.url_helpers
,但无法正常工作 请随时上学我:)
答案 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