我需要使用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
有没有更好的方法来实现这一目标?也许在配置文件中设置路由?
答案 0 :(得分:29)
在config/environments/development.rb
和config/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可以完成工作。