【问题标题】:How to set config.action_controller.default_url_options = {:host = '#''} on per environment basis如何根据每个环境设置 config.action_controller.default_url_options = {:host = '#''}
【发布时间】:2011-04-17 05:41:22
【问题描述】:

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

这让我发疯了,我在这里错过了什么???

【问题讨论】:

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


    【解决方案1】:

    好的,我想出了正确的写法是

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

    :)

    【讨论】:

    • 如果你有动态主机,那么它不是线程安全的。我发现只有一种方法,就是在ApplicationController中通过before_filter设置Thread.current,在Model中使用这个host。
    • 有没有办法从 config.routes 或类似的东西设置它?
    • @juanpastas:我刚刚添加到routes.rb的顶部:Example::Application.routes.default_url_options[:host] = 'example.com'
    • FWIW 我认为最好使用 _path 助手与 url 助手来解决......即相对路径与绝对 url。 :) 这通常是 rspec 的问题。
    • 切换到 _path 帮助器仅到目前为止有所帮助。例如,如果您使用 redirect_to,它会在后台调用 url_for,因此您每次调用时都需要传递 :only_path => true。
    【解决方案2】:

    ActionMailer 继承您的应用程序的default_url_options

    您希望尽可能保持 DRY,因此理想情况下,您不希望在同一环境的多个位置对主机和端口进行硬编码,除非您的 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"}
    

    【讨论】:

    • 如果您这样做,您可能希望在您的 Action Mailer default_url_options 上方添加注释,说明应用程序 default_url_options 继承它们。不希望有人更改 Action Mailer default_url_options 却没有意识到它将为整个应用程序更改它们。
    • @DavidGay 同意。理想情况下,我宁愿明确设置default_url_options,然后指定action_mailer.default_url_options 继承自那些。出于某种原因,2.5 年前我没有那样做。
    【解决方案3】:

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

    【讨论】:

    • 我已经完全重启了我的服务器,尝试了 10 次 :) 但没有工作
    【解决方案4】:

    config.action_mailer.default_url_options = { :host => "你的主机" }

    例如你的主机 localhost:3000

    你可以把它放在 test.rb、development.rb、production.rb 文件中,主机可能因环境而异

    【讨论】:

      【解决方案5】:

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

      将此行添加到您想要的主机

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

      【讨论】:

        【解决方案6】:

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

        然后我就可以在本地运行我的开发环境了。

        【讨论】:

          【解决方案7】:

          我自己尝试在 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进行了适当的更改。

          【讨论】:

            【解决方案8】:

            对我来说有效的是

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-23
              • 2018-02-17
              • 1970-01-01
              相关资源
              最近更新 更多