2012-11-22 23 views
17

Tôi có một số middleware for announcing my application on the local network app using Bonjour, nhưng nó cũng thông báo dịch vụ khi Rails được gọi từ rake hoặc thông qua bàn điều khiển.Làm thế nào để xác định xem Rails đang chạy từ CLI, giao diện điều khiển hoặc máy chủ?

Tôi muốn loại trừ các trường hợp này và chỉ sử dụng phần mềm trung gian Bonjour khi Rails đang chạy dưới dạng máy chủ.

Cấu hình trung gian chấp nhận một proc để loại trừ middlewares dưới những điều kiện nhất định sử dụng một proc:

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

Nhưng làm thế nào để xác định xem Rails được gọi từ CLI, giao diện điều khiển hoặc như một máy chủ?

Trả lời

26

Peeking tại Rails mô-đun sử dụng pry tiết lộ rằng console lời gọi có thể được phát hiện như thế này:

Rails.const_defined? 'Console' 

Và máy chủ invocations như thế này:

Rails.const_defined? 'Server' 
+0

Cảm ơn! Sử dụng điều này trong application.rb bên trong một khối "config.after_initialize do", và nó hoạt động hoàn hảo! –

+3

Điều thú vị là, điều này chỉ hoạt động nếu các lệnh "rails s" hoặc "rails c" được gọi. Nếu bạn đang chạy máy chủ thông qua một lệnh khác (ví dụ: "unicorn_rails"), các hằng số này không bao giờ được xác định. Rails :: Server có vẻ như nó được định nghĩa là một phần của quá trình phân tích lệnh, mặc dù nó kế thừa từ :: Rack :: Server. –

+1

Điều này không làm việc cho tôi với Rails 4 ngay cả với đường ray c. Tôi đang nhận Server và Console được định nghĩa trong giao diện điều khiển. –

10

siêu hữu ích. Cảm ơn @crishoj.

tôi muốn kiểm tra Console đối tượng chặt chẽ hơn đối với một vấn đề khác tôi đang làm việc trên và phát hiện ra rằng hằng số Console có thể đạt được với Rails::Console, vì vậy một lựa chọn để kiểm tra sẽ được sử dụng:

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

'Máy chủ' không được xác định khi Rails 5 chạy dưới Hành khách.

Giải pháp tốt nhất mà tôi đã tìm thấy là một biến thể của this câu trả lời:

if %w(rails rake).include?(File.basename($0)) 
    <console or runner> 
else 
    <server>  
end 
Các vấn đề liên quan