如何从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选项,你可以做一些虚拟的方法。