如何从Rails模块访问URL助手


Answers:


128

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

 include Rails.application.routes.url_helpers

3
不适合我... :(您能提供更多详细信息吗?
Augustin Riedinger 2014年

应该注意的是,在rails应用程序内的单独类中进行该操作将删除现有的已初始化url_helpers,从而导致错误:缺少主机链接!请提供:host参数,设置default_url_options [:host],或将:only_path设置为true
3pns,2018年

4
如果您只需要使用一次或两次,则可以直接在线使用它,例如Rails.application.routes.url_helpers.users_path。我发现这对于其他阅读您的代码的人来说更加明确和有用。
约书亚·品特

30

这是我在任何情况下都可以做到的方式 include

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

在任何情况下都有效。如果您尝试使用includeurl_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

水豚试验的另一个例子

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

30

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

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

参考


我认为应该url_helpers不会url_helper
davmac 2014年

嗨,您如何知道应该将url_helpers委托给Rails.application.routes?您在哪里可以找到此文档?谢谢!
Nik So

1
@NikSo api.rubyonrails.org是开始探索的好地方。这是URL帮助程序的文档api.rubyonrails.org/classes/ActionController/UrlFor.html 包括整个模块似乎过大,委派是更好的选择,但再次是其个人意见:)
Naveed 2015年

6

我一直在努力与助手从默认的控制器和堆栈(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选项或请求的主机,则需要在中传递控制器/请求上下文
  • 如果您只需要路径,不需要主机,并且不关心url选项,则可以制作一些虚拟方法。

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

对于Augustin Riedinger,该授权代码需要引用url_helpers(复数),否则您将获得

未定义的方法“ url_helper”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.