Да, это возможно.
Работа команды rails s
в конце дня заключается в том, чтобы перейти к Rack и позволить ему выбрать сервер. По умолчанию обработчик Rack будет пытаться использовать mongrel
, и если он не сможет найти дворнягу, он будет использовать webrick
. Все, что нам нужно сделать, это слегка исправить обработчик. Нам нужно будет вставить наш патч в сам скрипт rails
. Вот что вы делаете, взломайте ваш файл script/rails
. По умолчанию это должно выглядеть так:
#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
APP_PATH = File.expand_path('../../config/application', __FILE__)
require File.expand_path('../../config/boot', __FILE__)
require 'rails/commands'
Мы вставляем наш патч прямо перед строкой require 'rails/commands'
. Наш новый файл должен выглядеть так:
#!/usr/bin/env ruby
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
APP_PATH = File.expand_path('../../config/application', __FILE__)
require File.expand_path('../../config/boot', __FILE__)
require 'rack/handler'
Rack::Handler.class_eval do
def self.default(options = {})
# Guess.
if ENV.include?("PHP_FCGI_CHILDREN")
# We already speak FastCGI
options.delete :File
options.delete :Port
Rack::Handler::FastCGI
elsif ENV.include?("REQUEST_METHOD")
Rack::Handler::CGI
else
begin
Rack::Handler::Mongrel
rescue LoadError
begin
Rack::Handler::Thin
rescue LoadError
Rack::Handler::WEBrick
end
end
end
end
end
require 'rails/commands'
Обратите внимание, что теперь он попробует Mongrel, и если возникнет ошибка, попробуйте Thin, и только потом переходите к Webrick. Теперь, когда вы набираете rails s
, мы получаем поведение, которое нам нужно.