Ruby on rails - 如何按环境设置 config.action_controller.default_url_options = {:host = '#}



现在我正在使用它,它适用于开发主机,但当我转到生产时,我必须手动更改{: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

这将解决您的问题,并自动将Applicationdefault_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):

相关内容

  • 没有找到相关文章

最新更新