Rails 4:根据环境使用不同的服务器端口

时间:2013-11-22 12:04:13

标签: ruby-on-rails ruby-on-rails-4 environment-variables boot

我正在尝试自动配置我的rails应用程序,我希望能够在不指定端口的情况下启动应用程序,因为我希望根据环境选择它。

具体而言(开始时很简单)如果环境正在生产,则在端口3000上运行应用程序,否则在端口3500上运行。

所以,按照这个答案,我在boot.rb文件中添加了以下内容:

require 'rails/commands/server'

module DefaultOptions
  def default_options
    super.merge!(Port: Rails.env.production? ? 3000 : 3500)
  end
end

Rails::Server.send(:prepend, DefaultOptions)

不幸的是我做错了,因为这是我运行rails s时的输出:

/home/luca/projects/ads_manager/config/boot.rb:10:in `default_options': undefined method `env' for Rails:Module (NoMethodError)
    from /usr/local/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:287:in `parse_options'
    from /usr/local/lib/ruby/gems/2.0.0/gems/rack-1.5.2/lib/rack/server.rb:184:in `options'
    from /usr/local/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands/server.rb:58:in `set_environment'
    from /usr/local/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands/server.rb:42:in `initialize'
    from /usr/local/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in `new'
    from /usr/local/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands.rb:73:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>'

知道为什么Rails.env不可用?

获得相同结果的替代方案确实非常受欢迎。

3 个答案:

答案 0 :(得分:2)

如果您使用的是* NIX系统,可以尝试以下

在您的终端中运行以下命令

export RAILS_ENV=production

注意: 这会暂时将环境设置为生产环境,如果您需要永久保存,请将其添加到.bashrc文件

然后启动您的应用程序服务器。

在boot.rb文件中,使用ENV['RAILS_ENV']代替Rails.env

希望这有帮助。

答案 1 :(得分:2)

我会尝试将您的解决方案只需将Rails.env.production?更改为ENV["RAILS_ENV"] != "production",然后就可以了:)所以:

require 'rails/commands/server'

module DefaultOptions
  def default_options
    super.merge!(Port: ENV["RAILS_ENV"] == "production" ? 3000 : 3500)
  end
end

Rails::Server.send(:prepend, DefaultOptions)

答案 2 :(得分:1)

Rails.env稍后在rails启动过程中设置,您可以尝试检查ENV [“RAILS_ENV”]吗?