如何从rails模块访问URL助手

我有一个function模块。 它驻留在/lib/contact.rb中:

module Contact class << self def run(current_user) ... end end end 

我想要访问模块内部的“user_path”这样的URL助手。 我怎么做?

在你的模块中,只需执行:

  include Rails.application.routes.url_helpers 

对url_helpers的委托似乎比将整个模块包含到模型中要好得多

 delegate :url_helpers, to: 'Rails.application.routes' url_helpers.users_url => 'www.foo.com/users' 

参考

这里是我如何在没有include情况下做到这一点

 routes = Rails.application.routes.url_helpers url = routes.some_path 

这在任何情况下都有效。 如果你想include url_helpers – 确保你在正确的地方这样做,例如这个工程

 module Contact class << self include Rails.application.routes.url_helpers end end 

这不起作用

 module Contact include Rails.application.routes.url_helpers class << self end end 

另一个水豚testing的例子

 feature 'bla-bla' do include Rails.application.routes.url_helpers path = some_path #unknown local variable some_path end 

现在是正确的

 include Rails.application.routes.url_helpers feature 'bla-bla' do path = some_path #this is ok end 
 delegate :url_helpers, to: 'Rails.application.routes' url_helpers.users_url => 'www.foo.com/users' 

到奥古斯丁Riedinger,该代表团代码需要引用url_helpers(复数),否则你会得到

未定义的方法`url_helper'

我一直在努力与助手期望从默认控制器和堆栈( default_url_options等),并不想硬编码的主机。

当然,我们的URL助手是由我们漂亮的模块提供的:

 include Rails.application.routes.url_helpers 

但是包括这个,(1)帮助者要去寻找default_url_options ,(2)不知道请求主机和请求。

主机部分来自控制器实例的url_options 。 因此,我将控制器上下文传递给我以前的模块,现在是一个类:

 class ApplicationController def do_nifty_things HasAccessToRoutes.new(self).render end end class HasAccessToRoutes include Rails.application.routes.url_helpers delegate :default_url_options, :url_options, to: :@context def initialize(context) @context = context end def render nifty_things_url end end 

可能不适合每一种情况,但是在实现一种自定义渲染器的时候对我来说是有用的。

以任何方式:

  • 如果您想要无缝地访问默认的url选项,或者请求的主机,则需要在其中传递控制器/请求上下文
  • 如果你只是需要path,没有主机,不关心url选项,你可以做一些虚拟的方法。