<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -370,18 +370,18 @@ module ActionController #:nodoc:
     attr_reader :template
 
     class &lt;&lt; self
-      def call(env)
-        # HACK: For global rescue to have access to the original request and response
-        request = env[&quot;action_controller.rescue.request&quot;] ||= ActionDispatch::Request.new(env)
-        response = env[&quot;action_controller.rescue.response&quot;] ||= ActionDispatch::Response.new
-        process(request, response)
-      end
-
-      # Factory for the standard create, process loop where the controller is discarded after processing.
-      def process(request, response) #:nodoc:
-        new.process(request, response)
+      def action(name = nil)
+        @actions ||= {}
+        @actions[name] ||= proc do |env| 
+          controller = new
+          # HACK: For global rescue to have access to the original request and response
+          request = env[&quot;action_controller.rescue.request&quot;] ||= ActionDispatch::Request.new(env)
+          response = env[&quot;action_controller.rescue.response&quot;] ||= ActionDispatch::Response.new
+          controller.action_name = name &amp;&amp; name.to_s
+          controller.process(request, response).to_a
+        end
       end
-
+      
       # Converts the class name from something like &quot;OneModule::TwoModule::NeatController&quot; to &quot;NeatController&quot;.
       def controller_class_name
         @controller_class_name ||= name.demodulize
@@ -518,7 +518,6 @@ module ActionController #:nodoc:
         assign_shortcuts(request, response)
         initialize_template_class(response)
         initialize_current_url
-        assign_names
 
         log_processing
         send(method, *arguments)
@@ -883,10 +882,6 @@ module ActionController #:nodoc:
         @performed_render || @performed_redirect
       end
 
-      def assign_names
-        @action_name = (params['action'] || 'index')
-      end
-
       def reset_variables_added_to_assigns
         @template.instance_variable_set(&quot;@assigns_added&quot;, nil)
       end</diff>
      <filename>actionpack/lib/action_controller/base/base.rb</filename>
    </modified>
    <modified>
      <diff>@@ -39,13 +39,20 @@ module ActionController
     end
     
     # :api: private
-    def call(env)
+    def call(name, env)
       @_request = ActionDispatch::Request.new(env)
       @_response = ActionDispatch::Response.new
-      process(@_request.parameters[:action])
+      process(name)
       @_response.body = response_body
       @_response.prepare!
-      self
+      to_rack
+    end
+    
+    def self.action(name)
+      @actions ||= {}
+      @actions[name] ||= proc do |env| 
+        new.call(name, env)
+      end
     end
     
     # :api: private</diff>
      <filename>actionpack/lib/action_controller/new_base/http.rb</filename>
    </modified>
    <modified>
      <diff>@@ -430,7 +430,7 @@ module ActionController
       def call(env)
         request = ActionDispatch::Request.new(env)
         app = Routing::Routes.recognize(request)
-        app.call(env).to_a
+        app.action(request.parameters[:action] || 'index').call(env)
       end
 
       def recognize(request)</diff>
      <filename>actionpack/lib/action_controller/routing/route_set.rb</filename>
    </modified>
    <modified>
      <diff>@@ -131,7 +131,11 @@ module ActionController #:nodoc:
       @request.session[&quot;flash&quot;] = ActionController::Flash::FlashHash.new.update(flash) if flash
       build_request_uri(action, parameters)
 
+      @request.env[&quot;action_controller.rescue.request&quot;] = @request
+      @request.env[&quot;action_controller.rescue.request&quot;] = @response
+
       Base.class_eval { include ProcessWithTest } unless Base &lt; ProcessWithTest
+      @controller.action_name = action.to_s
       @controller.process(@request, @response)
     end
 </diff>
      <filename>actionpack/lib/action_controller/testing/process.rb</filename>
    </modified>
    <modified>
      <diff>@@ -602,8 +602,9 @@ class FilterTest &lt; Test::Unit::TestCase
   def test_dynamic_dispatch
     %w(foo bar baz).each do |action|
       request = ActionController::TestRequest.new
+      request.env[&quot;action_controller.rescue.request&quot;] = request
       request.query_parameters[:choose] = action
-      response = DynamicDispatchController.process(request, ActionController::TestResponse.new)
+      response = DynamicDispatchController.action.call(request.env).last
       assert_equal action, response.body
     end
   end</diff>
      <filename>actionpack/test/controller/filters_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -101,20 +101,30 @@ class HelperTest &lt; Test::Unit::TestCase
     assert master_helper_methods.include?('delegate_attr=')
   end
 
-  def test_helper_for_nested_controller
+  def call_controller(klass, action)
     request  = ActionController::TestRequest.new
-    response = ActionController::TestResponse.new
-    request.action = 'render_hello_world'
+    request.env[&quot;action_controller.rescue.request&quot;] = request
+    klass.action(action).call(request.env)    
+  end
 
-    assert_equal 'hello: Iz guuut!', Fun::GamesController.process(request, response).body
+  def test_helper_for_nested_controller
+    assert_equal 'hello: Iz guuut!', 
+      call_controller(Fun::GamesController, &quot;render_hello_world&quot;).last.body
+    # request  = ActionController::TestRequest.new
+    # request.env[&quot;action_controller.rescue.request&quot;] = request
+    # 
+    # resp = Fun::GamesController.action(:render_hello_world).call(request.env)
+    # assert_equal 'hello: Iz guuut!', resp.last.body
   end
 
   def test_helper_for_acronym_controller
-    request  = ActionController::TestRequest.new
-    response = ActionController::TestResponse.new
-    request.action = 'test'
-
-    assert_equal 'test: baz', Fun::PdfController.process(request, response).body
+    assert_equal &quot;test: baz&quot;, call_controller(Fun::PdfController, &quot;test&quot;).last.body
+    # 
+    # request  = ActionController::TestRequest.new
+    # response = ActionController::TestResponse.new
+    # request.action = 'test'
+    # 
+    # assert_equal 'test: baz', Fun::PdfController.process(request, response).body
   end
 
   def test_all_helpers
@@ -204,6 +214,12 @@ class IsolatedHelpersTest &lt; Test::Unit::TestCase
     end
   end
 
+  def call_controller(klass, action)
+    request  = ActionController::TestRequest.new
+    request.env[&quot;action_controller.rescue.request&quot;] = request
+    klass.action(action).call(request.env)    
+  end
+
   def setup
     @request    = ActionController::TestRequest.new
     @response   = ActionController::TestResponse.new
@@ -211,14 +227,14 @@ class IsolatedHelpersTest &lt; Test::Unit::TestCase
   end
 
   def test_helper_in_a
-    assert_raise(ActionView::TemplateError) { A.process(@request, @response) }
+    assert_raise(ActionView::TemplateError) { call_controller(A, &quot;index&quot;) }
   end
 
   def test_helper_in_b
-    assert_equal 'B', B.process(@request, @response).body
+    assert_equal 'B', call_controller(B, &quot;index&quot;).last.body
   end
 
   def test_helper_in_c
-    assert_equal 'C', C.process(@request, @response).body
+    assert_equal 'C', call_controller(C, &quot;index&quot;).last.body
   end
 end</diff>
      <filename>actionpack/test/controller/helper_test.rb</filename>
    </modified>
    <modified>
      <diff>@@ -66,7 +66,7 @@ class Rack::TestCase &lt; ActiveSupport::TestCase
   end
   
   def assert_body(body)
-    assert_equal body, last_response.body
+    assert_equal body, Array.wrap(last_response.body).join
   end
   
   def self.assert_body(body)</diff>
      <filename>actionpack/test/new_base/test_helper.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>ad2a1b5cb1afb0ea810cfdcac2ba1be95c55f1aa</id>
    </parent>
  </parents>
  <author>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </author>
  <url>http://github.com/rails/rails/commit/72160d9f89481ea60c8268ff026099f07b1e5ed6</url>
  <id>72160d9f89481ea60c8268ff026099f07b1e5ed6</id>
  <committed-date>2009-05-02T02:15:09-07:00</committed-date>
  <authored-date>2009-05-02T02:15:09-07:00</authored-date>
  <message>Implement FooController.action(:name)

  * Rails actions are now Rack endpoints, and can be retrieved
    via FooController.action(name) and called with an env
  * Updated some tests that relied on the old internal
    #process/#call implementation</message>
  <tree>950b7516323658c7012e3ca742b7bd9930a83aa7</tree>
  <committer>
    <name>Yehuda Katz</name>
    <email>wycats@gmail.com</email>
  </committer>
</commit>
