[Edge Rails 3] Rack Middlewares
Posted on January 25, 2010
Só de curiosidade resolvi dar uma olhada no stack de Rack Middlewares no Rails 3 (aliás, acabei de subir mais uma atualização na aplicação demo Third Rail).
Com o comando “rake middleware” você consegue avaliar o stack. No Rails 2.3.5 a ordem é esta:
1 2 3 4 5 6 7 8 9 10 11 |
use Rack::Lock use ActionController::Failsafe use ActiveRecord::ConnectionAdapters::ConnectionManagement use ActiveRecord::QueryCache use ActiveRecord::SessionStore use ActionController::ParamsParser use Rack::MethodOverride use Rack::Head use ActionController::StringCoercion use Rack::Cache run ActionController::Dispatcher.new |
Já no Edge Rails 3 (25/01) está assim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
use ActionDispatch::Static use Rack::Lock use Rack::Runtime use Rails::Rack::Logger use ActionDispatch::ShowExceptions use ActionDispatch::Callbacks use ActionDispatch::Cookies use ActionDispatch::Session::CookieStore use ActionDispatch::Flash use ActionDispatch::Cascade use ActionDispatch::ParamsParser use Rack::MethodOverride use ActionDispatch::Head use ActiveRecord::ConnectionAdapters::ConnectionManagement use ActiveRecord::QueryCache run Class |
A mudança mais notável é que agora todos os middlewares que estavam no ActionController passaram para dentro do novo ActionDispatch. O primeiro middleware é para checar se estamos querendo um arquivo estático (no public) e faz sentido ele ser o primeiro, antes mesmo do Rack::Lock que coloca a execução da aplicação num bloco synchronized.
Em seguida o Rack::Runtime serve para colocar no header um “X-Runtime” para mostrar o tempo gasto na execução, em segundos. Do ActionDispatch o ShowExceptions serve para resgatar quaisquer exceções que acontecem na sua aplicação. Você pode escolher fazer alguma coisa com ela (por exemplo, com um “rescue_from” no controller).
Os próximos são bem óbvios: os before e after filters que colocamos nos controllers filtros como “to_prepare”, tratamento de cookies, session em cookie, mensagens no “flash”, opção de parar a execução em cascata do Rack, parser para o query string, o MethodOverride que “engana” o Rails quando um form dá Post com o campo “_method”, para verbos como “DELETE” e “PUT”, tratamento para o verbo “HEAD” e os middlewares para gerenciamento de conexão e query cache do ActiveRecord.
Você ainda pode configurar seus próprios middlewares ou inserí-los em qualquer lugar no meio da cadeia de execução padrão. Leia a seção Rails on Rack do Rails Guides oficial. Mas como exemplo, você precisa editar o arquivo *config/application.rb" e adicionar:
1 2 3 4 |
config.middleware Rack::SendFile config.middleware.insert_before ActionDispatch::ShowExceptions, Rack::Bug config.middleware.insert_after ActionDispatch::Head, Rack::ShowStatus config.middleware.swap Rails::Rack::Logger, Rack::Logger |
Baixe o código-fonte do Edge Rails:
1 2 3 4 5 |
git clone git://github.com/rails/rails.git cd rails git submodule init git submodule update gem bundle |
É muito interessante navegar pelo código fonte. Os Rack Middleware, por exemplo, você vai encontrar em “actionpack/lib/action_dispatch/middleware”. Dá para aprender muita coisa só de ler os códigos, especialmente agora que eles foram reorganizados.
O Rails 3 está praticamente batendo na porta.
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




