2013-03-22 9 views
8

specifiesRails neden bir nesneyi değil, bir nesneyi çalıştıran bir config.ru oluşturur?

bir Raf uygulama aramaya cevap Ruby nesnesi (bir sınıf) Raf. Ben merak ediyorum Yani

# This file is used by Rack-based servers to start the application. 

require ::File.expand_path('../config/environment', __FILE__) 
run RailsApp::Application 

: Raf olmasını belirtir değil run RailsApp::Application.new neden Raylar ise

class MyApp 
    def call(env) 
    [200, {"Content-Type" => "text/plain"}, ["Hello from Rack!\n"]] 
    end 
end 

run MyApp.new 

bu üretir

:

Sonuç olarak, basit bir config.ru şöyle Bir nesne, bir sınıf değil? Eksik olduğum Rails::Application hakkında özel bir şey var mı?

cevap

15

Bu gizli biraz :)

RailsApp::Application sırayla bir Rails::Railtie bir Rails::Engine olan Rails::Application bir çocuk sınıfı, aslında olmasıdır. Şimdi Rails::Railtie, bir çocuk sınıfı Railtie sınıfından (bu durumda Engine) miras kaldığı zaman çağrılan bir inherited hook'a sahiptir.

Bu geri arama, alt sınıfa Rails::Railtie::Configurable modülünü içerir. Bu modülde sihrin ilk bölümünü bulacaksınız.

sınıfı tanımlanmış olur method_missing yöntem sınıfın bir örneği, ilgili yöntemi çağırır veya daha az giderir için

Bu call Örnek yöntemi Rails::Application#call tanımlanan ve tipik Raf aktarma işlemleri yapar edilir
RailsApp::Application.new.call(...) 

.

Muhtemelen biraz daha fazla sihir vardır, bu% 100 eşdeğer olmamakla birlikte kabaca o kadar iyi olmalıdır ...

1

Ayrıca bir sınıf bir nesnedir. Raf, uygulama nesnesini (bu nedenle nesneyi sağlamanız gerektiğini belirtir) başlatmaz, bunu config.ru'da gerçekleştirirsiniz, böylece Rack 'çağrı' gönderdiğinde Rails sınıf nesnesinin tüm Rack kurallarını izlemesi şartıyla, bir sorun.

Dahili olarak, Rails'in call ürününde özel bir şey yapıp yapmadığını bilmiyorum. Her ikisi de uygulama sınıfının bir örneğini tükürdüğü ve çalıştırdığı bir fabrika yöntemi bile olabilir. Ancak Rack'u tatmin etmek gerekmiyor.