我有一个带有功能的模块。它位于/lib/contact.rb中:
module Contact
class << self
def run(current_user)
...
end
end
end
我想访问模块内的URL帮助程序,例如“ users_path”。我怎么做?
Answers:
在您的模块中,只需执行:
include Rails.application.routes.url_helpers
Rails.application.routes.url_helpers.users_path
。我发现这对于其他阅读您的代码的人来说更加明确和有用。
这是我在任何情况下都可以做到的方式 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
水豚试验的另一个例子
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
委派给url_helpers似乎比将整个模块包含到模型中要好得多
delegate :url_helpers, to: 'Rails.application.routes'
url_helpers.users_url => 'www.foo.com/users'
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
可能不适合所有情况,但是在实现某种自定义渲染器时对我很有用。
以任何方式: