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)
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)
我一直在努力解决帮助者从默认控制器和堆栈(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)
可能不适合所有情况,但在实现一种自定义渲染器时它对我很有用.
以任何方式: