如何从rails模块访问URL帮助程序

siz*_*zle 66 ruby url model ruby-on-rails helper

我有一个带功能的模块.它位于/lib/contact.rb中:

module Contact
  class << self
    def run(current_user)
      ...
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想访问模块中的'users_path'之类的URL帮助程序.我怎么做?

ron*_*ils 119

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

 include Rails.application.routes.url_helpers
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用...... :(你能提供更多细节吗? (3认同)
  • 当它被`class << self`包围时它起作用 (3认同)
  • 如果只需要一次或两次,则可以直接内联使用,例如`Rails.application.routes.url_helpers.users_path`。我发现这对于其他阅读您的代码的人来说更加明确和有用。 (2认同)

Nav*_*eed 27

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

delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'
Run Code Online (Sandbox Code Playgroud)

参考


Ant*_*kin 26

以下是我在没有任何情况下的表现 include

routes = Rails.application.routes.url_helpers
url = routes.some_path
Run Code Online (Sandbox Code Playgroud)

这适用于任何情况.如果你正在尝试includeurl_helpers - 确保你在正确的地方这样做,例如这是有效的

module Contact
  class << self
    include Rails.application.routes.url_helpers
  end
end
Run Code Online (Sandbox Code Playgroud)

这不起作用

module Contact
  include Rails.application.routes.url_helpers
  class << self
  end
end
Run Code Online (Sandbox Code Playgroud)

Capybara测试的另一个例子

feature 'bla-bla' do
  include Rails.application.routes.url_helpers
  path = some_path #unknown local variable some_path
end
Run Code Online (Sandbox Code Playgroud)

而现在是正确的

include Rails.application.routes.url_helpers
feature 'bla-bla' do
  path = some_path #this is ok
end
Run Code Online (Sandbox Code Playgroud)


Jon*_*ard 5

我一直在努力解决帮助者从默认控制器和堆栈(default_url_options等等)所期待的细节,并且不想对主机进行硬编码.

我们的URL帮助程序由我们的漂亮模块提供,当然:

include Rails.application.routes.url_helpers
Run Code Online (Sandbox Code Playgroud)

但是按原样包含这个,并且(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
Run Code Online (Sandbox Code Playgroud)

可能不适合所有情况,但在实现一种自定义渲染器时它对我很有用.

以任何方式:

  • 如果要无缝访问默认URL选项或请求的主机,则需要传递控制器/请求上下文
  • 如果你只需要路径,没有主机,并且不关心url选项,你可以制作一些虚拟方法.