如何从 rails 模块访问 URL 助手

Posted

技术标签:

【中文标题】如何从 rails 模块访问 URL 助手【英文标题】:How to access URL helper from rails module 【发布时间】:2011-08-29 19:27:26 【问题描述】:

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

module Contact
  class << self
    def run(current_user)
      ...
    end
  end
end

我想访问模块内的 URL 帮助程序,例如“users_path”。我怎么做?

【问题讨论】:

Can Rails Routing Helpers (i.e. mymodel_path(model)) be Used in Models?的可能重复 【参考方案1】:

我一直在努力解决助手对默认控制器和堆栈(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 选项,你可以做一些虚拟方法。

【讨论】:

【参考方案2】:

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

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

reference

【讨论】:

我认为应该是 url_helpers 而不是 url_helper 您好,您怎么知道应该将 url_helpers 委托给 Rails.application.routes?您在哪里可以找到此文档?谢谢! @NikSo api.rubyonrails.org 是开始探索的好地方。这是 URL 助手的文档api.rubyonrails.org/classes/ActionController/UrlFor.html 包括整个模块似乎有点过分,委托是更好的选择,但还是个人意见:)【参考方案3】:
delegate :url_helpers, to: 'Rails.application.routes' 
url_helpers.users_url  => 'www.foo.com/users'

对 Augustin Riedinger,委托代码需要引用 url_helpers(复数),否则你会得到 ​​p>

未定义的方法`url_helper'

【讨论】:

【参考方案4】:

这是我在没有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

Capybara 测试的另一个示例

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

【讨论】:

【参考方案5】:

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

 include Rails.application.routes.url_helpers

【讨论】:

对我不起作用... :(你能提供更多细节吗? 应该注意的是,在 Rails 应用程序内的单独类中包含该操作将擦除现有的已初始化 url_helpers,从而导致错误:缺少要链接的主机!请提供 :host 参数,设置 default_url_options[:host],或设置 :only_path 为 true 如果只需要一两次,可以直接内联使用,如Rails.application.routes.url_helpers.users_path。我发现这对阅读您的代码的其他人更明确和有帮助。

以上是关于如何从 rails 模块访问 URL 助手的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

如何将 Rails 视图助手提取到 gem 中?

如何通过任意 erb 文件访问任意视图助手的方法?

如何在Rails中正确使用控制器助手模块,以及如何在这些助手之间建立连接?

(Rails)从不同视图中的控制器访问方法

Rails - 如何向 url 助手添加格式?