如何从lib目录中的文件使用路由助手方法?

时间:2012-02-15 16:44:14

标签: ruby-on-rails ruby-on-rails-3

我需要使用root_url文件夹中文件中定义的方法的lib方法。这可能吗?

我尝试在我的班级中加入这一行:

include Rails.application.routes.url_helpers

但这给了我错误

  

缺少主机链接!请提供:host参数或设置default_url_options [:host]


编辑:我发现如果我首先初始化路线就可以了:

def initialize_routes
  if Rails.env.development? || Rails.env.test?
    Rails.application.routes.default_url_options[:host] = 'localhost:3000' 
  elsif Rails.env.production?
    Rails.application.routes.default_url_options[:host] = 'example.com'
  end
end

有没有更好的方法来实现这一目标?也许在配置文件中设置路由?

4 个答案:

答案 0 :(得分:29)

正如评论中所提到的,@ JDutil的#3解决方案是配置动作邮件程序而不是路由器的路由。但是,在配置中,您可以执行以下操作:

config/environments/development.rbconfig/environments/test.rb

MyApp::Application.configure do
  # other configuration ...
  config.after_initialize do
    Rails.application.routes.default_url_options[:host] = 'localhost:3000'
  end
end

答案 1 :(得分:12)

应该有一些解决方案。

1)在主机参数中使用root_url传递时:

root_url(:host => 'localhost')

然而,这需要具体环境。

2)您还应该能够设置路线default_url_options,如:

Rails.application.routes.default_url_options[:host]= 'localhost:3000'

3)在您的环境配置文件中,您应该按照错误中的说明设置default_url_options。例如:

config/environments/development.rb

config.action_mailer.default_url_options[:host] = 'localhost'

config/environments/test.rb

config.action_mailer.default_url_options[:host] = 'localhost'

config/environments/production.rb

config.action_mailer.default_url_options[:host] = 'production.com'

答案 2 :(得分:6)

如果你依赖于url_helpers之类的ActiveModel::Serializers(至少是v0.9。*系列),那么你将在主Rails请求/响应流之外生成URL,你还需要设置Rails.application.routes.default_url_options。我这样做了,

# config/application.rb

config.after_initialize do
  Rails.application.routes.default_url_options = config.action_mailer.default_url_options
end

现在可以使用默认主机在后台作业等地方使用网址助手......

答案 3 :(得分:1)

我有完全相同的问题,没有任何配置建议有效。让我感到困惑的是,url_helpers在应用程序的其他部分(特别是帮助程序)中运行得很好。因此,我不必插入新配置以便能够在其他地方使用它们。

我在一天结束时的解决方案就是这样做:

Rails.application.routes.url_helpers.athlete_url(athlete)

我怀疑,虽然我无法证明,但手动包含网址助手:

include Rails.application.routes.url_helpers

实际上会导致执行一些included块。这样做会从尝试使用它的代码下更改配置。不包括,而是直接引用任何包含的'块不会被重新执行。

我很想知道是否有人可以解释我是在正确的轨道上还是做出错误的假设。

尽管如此,引用带有完整模块/类路径的url_helpers可以完成工作。