SlideShare uma empresa Scribd logo
1 de 24
Rails 2.3


 Brian Turnbull
http://brianturnbull.com
Templates
rails app
                           rails app’
template


        rails app -m template.rb

rails app -m http://example.com/template

rake rails:template LOCATION=template.rb
Templates
# template.rb
gem quot;hpricotquot;
rake quot;gems:installquot;
run quot;rm public/index.htmlquot;
generate :scaffold, quot;person name:stringquot;
route quot;map.root :controller => 'people'quot;
rake quot;db:migratequot;

git :init
git :add => quot;.quot;
git :commit => quot;-a -m 'Initial commit'quot;


      Pratik Naik — http://m.onkey.org/2008/12/4/rails-templates
Templates

      Jeremy McAnally’s Template Library
http://github.com/jeremymcanally/rails-templates/tree/master
Engines
                Rails Plugins turned to Eleven

                Share Models, Views, and
                Controllers with Host App

                Share Routes with Host App


http://rails-engines.org/news/2009/02/02/engines-in-rails-2-3/
Engines

                Not Yet Fully Baked

                Manually Manage Migrations

                Manually Merge Public Assets



http://rails-engines.org/news/2009/02/02/engines-in-rails-2-3/
Nested Transactions
User.transaction do
  User.create(:username => 'Admin')
  User.transaction(:requires_new => true) do
    User.create(:username => 'Regular')
    raise ActiveRecord::Rollback
  end
end

User.find(:all)     # => Returns only Admin




        http://guides.rubyonrails.org/2_3_release_notes.html
Nested Attributes

class Book < ActiveRecord::Base
  has_one :author
  has_many :pages

  accepts_nested_attributes_for :author, :pages
end




        http://guides.rubyonrails.org/2_3_release_notes.html
Nested Forms
class Book < ActiveRecord::Base
  has_many :authors
  accepts_nested_attributes_for :authors
end

<% form_for @book do |book_form| %>
  <div>
    <%= book_form.label :title, 'Book Title:' %>
    <%= book_form.text_field :title %>
  </div>
  <% book_form.fields_for :authors do |author_form| %>
      <div>
        <%= author_form.label :name, 'Author Name:' %>
        <%= author_form.text_field :name %>
      </div>
    <% end %>
  <% end %>
  <%= book_form.submit %>
<% end %>


            http://guides.rubyonrails.org/2_3_release_notes.html
Dynamic and Default Scopes
## id          Integer
## customer_id Integer
## status      String
## entered_at DateTime
class Order < ActiveRecord::Base
  belongs_to :customer
  default_scope :order => 'entered_at'
end

Order.scoped_by_customer_id(12)
Order.scoped_by_customer_id(12).find(:all,
  :conditions => quot;status = 'open'quot;)
Order.scoped_by_customer_id(12).scoped_by_status(quot;openquot;)




          http://guides.rubyonrails.org/2_3_release_notes.html
Other Changes

          Multiple Conditions for Callbacks
          HTTP Digest Authentication
          Lazy Loaded Sessions
          Localized Views
          and More!



http://guides.rubyonrails.org/2_3_release_notes.html
Rails 2.3
Rails Metal
SPEED
Simplicity
Metal Endpoint
 ## app/metal/hello_metal.rb
 class HelloMetal
   def self.call(env)
     if env[quot;PATH_INFOquot;] =~ /^/hello/metal/
       [200, {quot;Content-Typequot; => quot;text/plainquot;}, [quot;Hello, Metal!quot;]]
     else
       [404, {quot;Content-Typequot; => quot;text/htmlquot;}, [quot;Not Foundquot;]]
     end
   end
 end




http://soylentfoo.jnewland.com/articles/2008/12/16/rails-metal-a-micro-framework-with-the-power-of-rails-m
Equivalent Controller

 ## app/controllers/hello_rails_controller.rb
 class HelloRailsController < ApplicationController
   def show
     headers['Content-Type'] = 'text/plain'
     render :text => 'Hello, Rails!'
   end
 end




http://soylentfoo.jnewland.com/articles/2008/12/16/rails-metal-a-micro-framework-with-the-power-of-rails-m
Sinatra!
 require 'sinatra'
 Sinatra::Application.set(:run => false)
 Sinatra::Application.set(:environment => :production)

 HelloSinatra = Sinatra::Application.new unless defined? HelloSinatra

 get '/hello/sinatra' do
   response['Content-Type'] = 'text/plain'
   'Hello, Sinatra!'
 end




http://soylentfoo.jnewland.com/articles/2008/12/16/rails-metal-a-micro-framework-with-the-power-of-rails-m
Rack
Object.call(env)


[status,
 headers,
 response]
Metal Endpoint
## app/metal/hello_metal.rb
class HelloMetal
  def self.call(env)
    if env[quot;PATH_INFOquot;] =~ /^/hello/metal/
      [200, {quot;Content-Typequot; => quot;text/plainquot;}, [quot;Hello, Metal!quot;]]
    else
      [404, {quot;Content-Typequot; => quot;text/htmlquot;}, [quot;Not Foundquot;]]
    end
  end
end
Rack Middleware in Rails
            Rails Dispatcher
call(env)                      [s,h,r]

              Middleware
call(env)                      [s,h,r]

              Middleware
call(env)                      [s,h,r]

              Web Server
Rack Middleware in Rails
% rake middleware
use Rack::Lock
use ActionController::Failsafe
use ActionController::Session::CookieStore
use Rails::Rack::Metal
use ActionController::RewindableInput
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new
Rack Middleware in Rails
% rake middleware
use Rack::Lock
use ActionController::Failsafe
use ActionController::Session::CookieStore
use Rails::Rack::Metal
use ActionController::RewindableInput
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new
Django > Rails?
## lib/middleware/django_middleware.rb
class DjangoMiddleware
  def initialize(app)
    @app = app
  end

  def call(env)
    status, headers, response = @app.call(env)
    new_response = []
    response.each do |part|
      new_response << part.gsub(/Rails/, 'Django')
    end
    [status, headers, new_response]
  end
end

## config/environment.rb
config.middleware.use DjangoMiddleware
http://github.com/bturnbull/bturnbull-metal-demo

Mais conteúdo relacionado

Mais procurados

Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
Yehuda Katz
 
multiple views and routing
multiple views and routingmultiple views and routing
multiple views and routing
Brajesh Yadav
 
Merb Pluming - The Router
Merb Pluming - The RouterMerb Pluming - The Router
Merb Pluming - The Router
carllerche
 

Mais procurados (20)

Curing Webpack Cancer
Curing Webpack CancerCuring Webpack Cancer
Curing Webpack Cancer
 
RoR 101: Session 3
RoR 101: Session 3RoR 101: Session 3
RoR 101: Session 3
 
RoR 101: Session 6
RoR 101: Session 6RoR 101: Session 6
RoR 101: Session 6
 
Cocoa on-rails-3rd
Cocoa on-rails-3rdCocoa on-rails-3rd
Cocoa on-rails-3rd
 
RoR 101: Session 6
RoR 101: Session 6RoR 101: Session 6
RoR 101: Session 6
 
Rails::Engine
Rails::EngineRails::Engine
Rails::Engine
 
Introduction to AngularJS For WordPress Developers
Introduction to AngularJS For WordPress DevelopersIntroduction to AngularJS For WordPress Developers
Introduction to AngularJS For WordPress Developers
 
Rest web service_with_spring_hateoas
Rest web service_with_spring_hateoasRest web service_with_spring_hateoas
Rest web service_with_spring_hateoas
 
ASP.NET MVC introduction
ASP.NET MVC introductionASP.NET MVC introduction
ASP.NET MVC introduction
 
Advanced RESTful Rails
Advanced RESTful RailsAdvanced RESTful Rails
Advanced RESTful Rails
 
Ride on the Fast Track of Web with Ruby on Rails- Part 2
Ride on the Fast Track of Web with Ruby on Rails- Part 2Ride on the Fast Track of Web with Ruby on Rails- Part 2
Ride on the Fast Track of Web with Ruby on Rails- Part 2
 
Rails 3: Dashing to the Finish
Rails 3: Dashing to the FinishRails 3: Dashing to the Finish
Rails 3: Dashing to the Finish
 
Ajax pagination using j query in rails3
Ajax pagination using j query in rails3Ajax pagination using j query in rails3
Ajax pagination using j query in rails3
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
 
multiple views and routing
multiple views and routingmultiple views and routing
multiple views and routing
 
ASP.NET Page Life Cycle
ASP.NET Page Life CycleASP.NET Page Life Cycle
ASP.NET Page Life Cycle
 
Laravel Beginners Tutorial 2
Laravel Beginners Tutorial 2Laravel Beginners Tutorial 2
Laravel Beginners Tutorial 2
 
Ember - introduction
Ember - introductionEmber - introduction
Ember - introduction
 
Rack
RackRack
Rack
 
Merb Pluming - The Router
Merb Pluming - The RouterMerb Pluming - The Router
Merb Pluming - The Router
 

Destaque (6)

Peer Advising Wiki Tutorial
Peer Advising Wiki TutorialPeer Advising Wiki Tutorial
Peer Advising Wiki Tutorial
 
Monit - NHRuby May 2009
Monit - NHRuby May 2009Monit - NHRuby May 2009
Monit - NHRuby May 2009
 
Go Ahead, Get Close; Commit to Customer Relationships through Direct Response
Go Ahead, Get Close; Commit to Customer Relationships through Direct ResponseGo Ahead, Get Close; Commit to Customer Relationships through Direct Response
Go Ahead, Get Close; Commit to Customer Relationships through Direct Response
 
Four Bear Advisors Presentation, Spring 2012
Four Bear Advisors Presentation, Spring 2012Four Bear Advisors Presentation, Spring 2012
Four Bear Advisors Presentation, Spring 2012
 
RVM - NHRuby Nov 2009
RVM - NHRuby Nov 2009RVM - NHRuby Nov 2009
RVM - NHRuby Nov 2009
 
OOP Intro in Ruby for NHRuby Feb 2010
OOP Intro in Ruby for NHRuby Feb 2010OOP Intro in Ruby for NHRuby Feb 2010
OOP Intro in Ruby for NHRuby Feb 2010
 

Semelhante a Rails 2.3 and Rack - NHRuby Feb 2009

Integrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby AmfIntegrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby Amf
railsconf
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
Yi-Ting Cheng
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
Yehuda Katz
 
Building Web Interface On Rails
Building Web Interface On RailsBuilding Web Interface On Rails
Building Web Interface On Rails
Wen-Tien Chang
 
WebcampZG - Rails 4
WebcampZG - Rails 4WebcampZG - Rails 4
WebcampZG - Rails 4
shnikola
 

Semelhante a Rails 2.3 and Rack - NHRuby Feb 2009 (20)

Integrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby AmfIntegrating Flex And Rails With Ruby Amf
Integrating Flex And Rails With Ruby Amf
 
Flex With Rubyamf
Flex With RubyamfFlex With Rubyamf
Flex With Rubyamf
 
Rails 3
Rails 3Rails 3
Rails 3
 
OSDC 2009 Rails Turtorial
OSDC 2009 Rails TurtorialOSDC 2009 Rails Turtorial
OSDC 2009 Rails Turtorial
 
Jicc teaching rails
Jicc teaching railsJicc teaching rails
Jicc teaching rails
 
Rails 4.0
Rails 4.0Rails 4.0
Rails 4.0
 
Deploy Rails Application by Capistrano
Deploy Rails Application by CapistranoDeploy Rails Application by Capistrano
Deploy Rails Application by Capistrano
 
Rails 3 overview
Rails 3 overviewRails 3 overview
Rails 3 overview
 
Jasig Rubyon Rails
Jasig Rubyon RailsJasig Rubyon Rails
Jasig Rubyon Rails
 
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
浜松Rails3道場 其の壱 プロジェクト作成〜Rouging編
 
Adventurous Merb
Adventurous MerbAdventurous Merb
Adventurous Merb
 
Building Web Interface On Rails
Building Web Interface On RailsBuilding Web Interface On Rails
Building Web Interface On Rails
 
Merb Router
Merb RouterMerb Router
Merb Router
 
Lightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClientLightweight Webservices with Sinatra and RestClient
Lightweight Webservices with Sinatra and RestClient
 
WebcampZG - Rails 4
WebcampZG - Rails 4WebcampZG - Rails 4
WebcampZG - Rails 4
 
Boston Computing Review - Ruby on Rails
Boston Computing Review - Ruby on RailsBoston Computing Review - Ruby on Rails
Boston Computing Review - Ruby on Rails
 
Rack
RackRack
Rack
 
Introduction To Ruby On Rails
Introduction To Ruby On RailsIntroduction To Ruby On Rails
Introduction To Ruby On Rails
 
Introduction To ASP.NET MVC
Introduction To ASP.NET MVCIntroduction To ASP.NET MVC
Introduction To ASP.NET MVC
 
Intro to Rack
Intro to RackIntro to Rack
Intro to Rack
 

Último

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot ModelMcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Mcleodganj Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 

Rails 2.3 and Rack - NHRuby Feb 2009

  • 1. Rails 2.3 Brian Turnbull http://brianturnbull.com
  • 2. Templates rails app rails app’ template rails app -m template.rb rails app -m http://example.com/template rake rails:template LOCATION=template.rb
  • 3. Templates # template.rb gem quot;hpricotquot; rake quot;gems:installquot; run quot;rm public/index.htmlquot; generate :scaffold, quot;person name:stringquot; route quot;map.root :controller => 'people'quot; rake quot;db:migratequot; git :init git :add => quot;.quot; git :commit => quot;-a -m 'Initial commit'quot; Pratik Naik — http://m.onkey.org/2008/12/4/rails-templates
  • 4. Templates Jeremy McAnally’s Template Library http://github.com/jeremymcanally/rails-templates/tree/master
  • 5. Engines Rails Plugins turned to Eleven Share Models, Views, and Controllers with Host App Share Routes with Host App http://rails-engines.org/news/2009/02/02/engines-in-rails-2-3/
  • 6. Engines Not Yet Fully Baked Manually Manage Migrations Manually Merge Public Assets http://rails-engines.org/news/2009/02/02/engines-in-rails-2-3/
  • 7. Nested Transactions User.transaction do User.create(:username => 'Admin') User.transaction(:requires_new => true) do User.create(:username => 'Regular') raise ActiveRecord::Rollback end end User.find(:all) # => Returns only Admin http://guides.rubyonrails.org/2_3_release_notes.html
  • 8. Nested Attributes class Book < ActiveRecord::Base has_one :author has_many :pages accepts_nested_attributes_for :author, :pages end http://guides.rubyonrails.org/2_3_release_notes.html
  • 9. Nested Forms class Book < ActiveRecord::Base has_many :authors accepts_nested_attributes_for :authors end <% form_for @book do |book_form| %> <div> <%= book_form.label :title, 'Book Title:' %> <%= book_form.text_field :title %> </div> <% book_form.fields_for :authors do |author_form| %> <div> <%= author_form.label :name, 'Author Name:' %> <%= author_form.text_field :name %> </div> <% end %> <% end %> <%= book_form.submit %> <% end %> http://guides.rubyonrails.org/2_3_release_notes.html
  • 10. Dynamic and Default Scopes ## id Integer ## customer_id Integer ## status String ## entered_at DateTime class Order < ActiveRecord::Base belongs_to :customer default_scope :order => 'entered_at' end Order.scoped_by_customer_id(12) Order.scoped_by_customer_id(12).find(:all, :conditions => quot;status = 'open'quot;) Order.scoped_by_customer_id(12).scoped_by_status(quot;openquot;) http://guides.rubyonrails.org/2_3_release_notes.html
  • 11. Other Changes Multiple Conditions for Callbacks HTTP Digest Authentication Lazy Loaded Sessions Localized Views and More! http://guides.rubyonrails.org/2_3_release_notes.html
  • 15. Metal Endpoint ## app/metal/hello_metal.rb class HelloMetal def self.call(env) if env[quot;PATH_INFOquot;] =~ /^/hello/metal/ [200, {quot;Content-Typequot; => quot;text/plainquot;}, [quot;Hello, Metal!quot;]] else [404, {quot;Content-Typequot; => quot;text/htmlquot;}, [quot;Not Foundquot;]] end end end http://soylentfoo.jnewland.com/articles/2008/12/16/rails-metal-a-micro-framework-with-the-power-of-rails-m
  • 16. Equivalent Controller ## app/controllers/hello_rails_controller.rb class HelloRailsController < ApplicationController def show headers['Content-Type'] = 'text/plain' render :text => 'Hello, Rails!' end end http://soylentfoo.jnewland.com/articles/2008/12/16/rails-metal-a-micro-framework-with-the-power-of-rails-m
  • 17. Sinatra! require 'sinatra' Sinatra::Application.set(:run => false) Sinatra::Application.set(:environment => :production) HelloSinatra = Sinatra::Application.new unless defined? HelloSinatra get '/hello/sinatra' do response['Content-Type'] = 'text/plain' 'Hello, Sinatra!' end http://soylentfoo.jnewland.com/articles/2008/12/16/rails-metal-a-micro-framework-with-the-power-of-rails-m
  • 19. Metal Endpoint ## app/metal/hello_metal.rb class HelloMetal def self.call(env) if env[quot;PATH_INFOquot;] =~ /^/hello/metal/ [200, {quot;Content-Typequot; => quot;text/plainquot;}, [quot;Hello, Metal!quot;]] else [404, {quot;Content-Typequot; => quot;text/htmlquot;}, [quot;Not Foundquot;]] end end end
  • 20. Rack Middleware in Rails Rails Dispatcher call(env) [s,h,r] Middleware call(env) [s,h,r] Middleware call(env) [s,h,r] Web Server
  • 21. Rack Middleware in Rails % rake middleware use Rack::Lock use ActionController::Failsafe use ActionController::Session::CookieStore use Rails::Rack::Metal use ActionController::RewindableInput use ActionController::ParamsParser use Rack::MethodOverride use Rack::Head use ActiveRecord::QueryCache run ActionController::Dispatcher.new
  • 22. Rack Middleware in Rails % rake middleware use Rack::Lock use ActionController::Failsafe use ActionController::Session::CookieStore use Rails::Rack::Metal use ActionController::RewindableInput use ActionController::ParamsParser use Rack::MethodOverride use Rack::Head use ActiveRecord::QueryCache run ActionController::Dispatcher.new
  • 23. Django > Rails? ## lib/middleware/django_middleware.rb class DjangoMiddleware def initialize(app) @app = app end def call(env) status, headers, response = @app.call(env) new_response = [] response.each do |part| new_response << part.gsub(/Rails/, 'Django') end [status, headers, new_response] end end ## config/environment.rb config.middleware.use DjangoMiddleware