2012-11-22 33 views
17

我有一个middleware for announcing my application on the local network app using Bonjour,但它也宣布从Rake或通过控制台调用Rails时的服务。如何确定Rails是从CLI,控制台还是作为服务器运行?

我想排除这些情况,只有在Rails作为服务器运行时才使用Bonjour中间件。

中间件配置接受一个进程使用排除在特定条件下的中间件一个proc

config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| 
    env['HTTPS'] != 'on' 
} 

但我怎么确定的Rails从CLI,控制台或服务器调用?

回答

26

在使用pryRails模块偷看表明控制台调用可以这样检测:

Rails.const_defined? 'Console' 

和服务器调用是这样的:

Rails.const_defined? 'Server' 
+0

谢谢!在“config.after_initialize do”块内的application.rb中使用它,它完美的工作! –

+3

有趣的是,这只有在命令“rails s”或“rails c”被调用时才有效。如果您通过其他命令(例如“unicorn_rails”)运行服务器,则这些常量永远不会被定义。 Rails :: Server看起来像它被定义为命令解析过程的一部分,尽管它继承自:: Rack :: Server。 –

+1

即使使用导轨c,这对于Rails 4也不适用。我正在控制台中定义服务器和控制台。 –

10

超级有用。谢谢@crishoj。

我想检查控制台更紧密地对象为我工作的另一个问题,结果发现,控制台常数可以Rails::Console达到,所以检查的另一种选择是使用:

defined? Rails::Console 
defined? Rails::Server 
2

Rails 5在Passenger下运行时未定义“服务器”。

我已经找到了最好的解决方案是this答案的变体:

if %w(rails rake).include?(File.basename($0)) 
    <console or runner> 
else 
    <server>  
end 
相关问题