如何在每个环境的基础上设置config.action_controller.default_url_options = {:host ='#''}

时间:2011-04-17 05:41:22

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

现在我正在使用这个适用于开发主机,但我必须手动更改{: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

这让我发疯,我在这里失踪了什么?

8 个答案:

答案 0 :(得分:113)

好的,我认为正确的写作方式是

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

:)

答案 1 :(得分:6)

在对此文件的更改生效之前,您必须重新启动服务器。

答案 2 :(得分:5)

default_url_options继承您的应用程序ActionMailer

您希望尽可能保持干净,因此,理想情况下,您不希望在同一环境的多个位置对主机和端口进行硬编码,除非您的ActionMailer 实际< / em>使用与Application的其余部分不同的主机和端口。

要为整个default_url_options设置Application,只需将以下行添加到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"}

答案 3 :(得分:1)

config.action_mailer.default_url_options = {:host =>“您的主机”}

例如您的主机localhost:3000

您可以将其放置在test.rb,development.rb,production.rb文件的主机中,这可能因环境而异

答案 4 :(得分:0)

我知道这是一个旧线程,但是我在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

然后,我能够在本地运行我的开发环境。

答案 5 :(得分:0)

对我来说有效的是

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):

答案 6 :(得分:0)

config / environments / development.rb (任何其他环境,相同)

在此行中添加所需的主机

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

答案 7 :(得分:0)

我自己在尝试在 rake 任务中生成 URL 时遇到了这个问题。这绝对不是显而易见的,其中许多解决方案都会起作用。我的解决方案是从@joshua-pinter's 开始,但在环境文件中完成。例如我的 development.rb 看起来像:

Rails.application.configure do
  …
  config.action_mailer.default_url_options = self.default_url_options = { host: 'localhost', port: 3000 }
  …
end

production.rb 进行适当的更改。