Ruby on rails Rails 4:根据环境使用不同的服务器端口
我正在尝试自动配置rails应用程序,我希望能够在不指定端口的情况下启动应用程序,因为我希望根据环境选择端口 具体来说(一开始很简单),如果环境是生产环境,则在端口3000上运行应用程序,否则在端口3500上运行应用程序 因此,根据这个答案,我在boot.rb文件中添加了以下内容:Ruby on rails Rails 4:根据环境使用不同的服务器端口,ruby-on-rails,ruby-on-rails-4,environment-variables,boot,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.en
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>'
/home/luca/projects/ads_manager/config/boot.rb:10:in'default_options':Rails:Module(NoMethodError)的未定义方法'env'
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'
来自/usr/local/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands/server.rb:58:在“set_环境”中
来自/usr/local/lib/ruby/gems/2.0.0/gems/railties-4.0.0/lib/rails/commands/server.rb:42:在“初始化”中
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`'
从箱子/轨道:4:in“require”
从箱子/轨道:4:in`'
知道Rails.env为什么不可用吗
获得相同结果的替代方法确实非常受欢迎。如果您使用*NIX系统,您可以尝试以下方法 在终端中运行下面的命令
export RAILS\u ENV=production
注意:这将暂时将环境设置为生产环境,如果您需要永久设置,请将其添加到.bashrc文件中
然后启动应用服务器
在boot.rb文件中,使用ENV['RAILS\u ENV']
而不是RAILS.ENV
希望这能有所帮助。Rails.env将在Rails引导过程中稍后设置,您可以尝试检查env[“Rails_env”]吗?我会尝试您的解决方案,只是将
Rails.env.production?
更改为env[“Rails_env”!=“生产”
而且它是有效的:)因此:
@Gopallathore我不知道它怎么能改变港口。你能再解释一下吗?这是否意味着“仅当不是生产时才执行此操作”?只需为生产环境设置一个端口,对于开发,将使用默认值3000。它是否正确地适用于u。。。实际上我没有测试它。你删除了代码,我无法尝试。无论如何,我想做相反的事情:3000端口用于生产,3500端口用于其他环境。也许可以代替
Rails.env.production?
类似的东西:(env['Rails_env']| | development')=='production'
我在本地机器上试用过,效果很好:)顺便说一句,我想知道当你想运行不同的环境时会发生什么(比如生产和发展)在同一台机器上。我想这种方法意味着必须正确设置不同用户的.bashrc
文件。对吗?将环境添加到.bashrc
并不是强制的。您也可以在命令中使用它,使用以下方法启动rails服务器rails\u ENV=development rails s
ye啊,编辑你的答案,包括我的,祝你好运,兄弟!嘿@DeeY,这是一个屏幕截图,显示了我答案的第一个版本。请看一下上面提到的时间戳,然后与你提交答案的时间进行比较。很清楚是谁复制了答案,这是另一个屏幕截图,显示了m的哪些部分这是我编辑过的答案。
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)