现在我正在使用它,它适用于开发主机,但当我转到生产时,我必须手动更改{:host=>"}代码。
post.rb
def share_all
url = Rails.application.routes.url_helpers.post_url(self, :host => 'localhost:3000')
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
我想使用这个,然后定义每个环境的default_url_options:
post.rb
def share_all
url = Rails.application.routes.url_helpers.post_url(self)
if user.authentications.where(:provider => 'twitter').any?
user.twitter_share(url)
end
end
我已经尝试将其添加到我的config/environments/development.rb中,但我仍然得到"缺少要链接的主机!请提供:host参数或设置default_url_options[:host]"错误
development.rb
config.action_controller.default_url_options = {:host => "localhost:3000"}
我甚至尝试过这种方式:
development.rb
config.action_controller.default_url_options = {:host => "localhost", :port => "3000"}
编辑:
我现在也遵循了这个错误指南http://edgeguides.rubyonrails.org/action_controller_overview.html#default_url_options
应用程序控制器
class ApplicationController < ActionController::Base
protect_from_forgery
include ApplicationHelper
def default_url_options
if Rails.env.production?
{ :host => "example.com"}
else
{:host => "example1.com"}
end
end
end
这让我疯了,我在这里错过了什么???
好吧,我想好了写它的正确方法是
Rails.application.routes.default_url_options[:host] = 'localhost:3000'
:(
从ActionMailer
继承应用程序的default_url_options
您希望尽可能保持干燥,因此,理想情况下,您不希望在同一环境的多个位置对主机和端口进行硬编码,除非您的ActionMailer
实际上使用了与其他Application
不同的主机和端口。
要为整个Application
设置default_url_options
,只需在config/environment.rb
文件中添加以下行(将MyApp
更改为应用程序名称(:
# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options
这将解决您的问题,并自动将Application
的default_url_options
设置为与config.action_mailer.default_url_options
:相同
$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}
在对该文件的更改生效之前,您必须重新启动服务器。
config/environments/development.rb(任何其他环境,相同(
用您想要的主机添加此行
routes.default_url_options[:host] = 'localhost:3000'
config.action_mailer.default_url_options={:host=>"您的主机"}
例如,您的主机localhost:3000
你可以把这个放在test.rb,development.rb,production.rb文件主机可能因环境而异
我知道这是一个旧线程,但我在Ruby 2.6.3和Rails 5.2.3中遇到了这个问题。我看到的行为基本上是,我添加的每一条路径都会因Error during failsafe response: undefined method 'empty?' for nil:NilClass
而失败。在生产中,它运行良好,但在我的开发环境中,我会遇到上面提到的错误。
对我来说,修复方法是将此添加到controllers/application_controller.rb
:
def default_url_options
if Rails.env.production?
Rails.application.routes.default_url_options = { host: "www.production-domain.com", protocol: 'https' }
elsif Rails.env.development?
Rails.application.routes.default_url_options = { host: 'localhost:3000', protocol: 'http' }
end
end
然后我就可以在本地运行我的开发环境了。
我自己在尝试在rake任务中生成URL时遇到了这个问题。这肯定不是显而易见的,其中许多解决方案都会起作用。我的解决方案是从@joshua-pinter的中提取,但在环境文件中完成。例如,我的development.rb
看起来像:
Rails.application.configure do
…
config.action_mailer.default_url_options = self.default_url_options = { host: 'localhost', port: 3000 }
…
end
其中对CCD_ 15进行了适当的改变。
这就是我通常处理这个问题的方式:
首先,从rails new
自动生成的文件中正确设置config/environments/production.rb
(和其他环境(:
Rails.application.configure do
# [...]
config.action_mailer.default_url_options = {
host: "https://your_app.your_domain.tld"
} # You may also use an env variable ENV['HOST'] if necessary
end
然后,返回您的config/application.rb
并设置为从ActionMailer配置继承:
require_relative "boot"
require "rails/all"
Bundler.require(*Rails.groups)
module YourModule
class Application < Rails::Application
# [...]
config.after_initialize do |app|
app.routes.default_url_options = app.config.action_mailer.default_url_options
end
end
end
对我来说,有效的是
ActionMailer::Base.default_url_options = { host: "yourhosthere"} # e.g. yourhosthere=localhost:3000 or yourhosthere=example.com
因为如果您已经在配置文件中设置了端口,那么只更改[:host]将导致错误
TypeError (no implicit conversion of Symbol into Integer):