4

我试图自动配置我的Rails应用程序,我希望能够启动应用程序而无需指定端口,因为我希望根据环境来选择它环境。Rails 4:根据环境使用不同的服务器端口

具体来说(一开始就很简单)在端口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不可用?

取得同样结果的替代方法确实值得欢迎。

+0

@Gopalrathore我看不出它如何能更改端口。你能多解释一下吗?这是否意味着“只有在不生产时才这样做”? – lucke84

+0

只是它为生产环境设置了一个端口,对于开发,默认情况下使用的是3000. –

+0

它适用于u吗? ...其实我没有测试过它。 –

回答

2

如果您使用的* NIX系统,你可以试试下面的

在你的终端运行下面​​的命令

export RAILS_ENV=production

注:这将设置环境到生产暂时地,如果你需要这个永久的,添加到你的.bashrc文件

然后开始你的应用程序离子服务器。

里面的boot.rb文件,使用ENV['RAILS_ENV']代替Rails.env

希望这有助于。

+0

我在本地机器上试过它,它工作:)顺便说一句,我想知道当你想运行不同的环境时会发生什么(比如说生产和开发)在同一台机器上。我想这种方法意味着必须为不同的用户设置正确的'.bashrc'文件。我对吗? – lucke84

+0

将环境添加到'.bashrc'不是强制。你也可以在命令中使用它来启动你的rails服务器,使用下面的方法'RAILS_ENV = development rails s' – Rohit

+0

是的,编辑你的答案以包含我的,路要走,兄弟! – DeeY

1

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

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) 
相关问题