提交 056042eb 编写于 作者: C Carlhuda

Simplify the action endpoint:

  * Remove ActionEndpoint in favor of passing a block to MiddlewareStack
  * Always create a Request; the performance win of RackDelegation is around
    the response; the Request object hit is limited to a single object allocation
  * #dispatch takes a Request
上级 146a5305
......@@ -34,7 +34,8 @@ def controller_name
# and response object available. You might wish to control the
# environment and response manually for performance reasons.
attr_internal :status, :headers, :content_type, :response
attr_internal :status, :headers, :content_type, :response, :request
delegate :session, :to => "@_request"
def initialize(*)
@_headers = {}
......@@ -66,8 +67,9 @@ def status=(status)
end
# :api: private
def dispatch(name, env)
@_env = env
def dispatch(name, request)
@_request = request
@_env = request.env
@_env['action_controller.instance'] = self
process(name)
to_a
......@@ -78,26 +80,6 @@ def to_a
response ? response.to_a : [status, headers, response_body]
end
class ActionEndpoint
@@endpoints = Hash.new {|h,k| h[k] = Hash.new {|sh,sk| sh[sk] = {} } }
def self.for(controller, action, stack)
@@endpoints[controller][action][stack] ||= begin
endpoint = new(controller, action)
stack.build(endpoint)
end
end
def initialize(controller, action)
@controller, @action = controller, action
@_formats = [Mime::HTML]
end
def call(env)
@controller.new.dispatch(@action, env)
end
end
class_attribute :middleware_stack
self.middleware_stack = ActionDispatch::MiddlewareStack.new
......@@ -127,8 +109,10 @@ def self.call(env)
#
# ==== Returns
# Proc:: A rack application
def self.action(name)
ActionEndpoint.for(self, name, middleware_stack)
def self.action(name, klass = ActionDispatch::Request)
middleware_stack.build do |env|
new.dispatch(name, klass.new(env))
end
end
end
end
......@@ -6,14 +6,11 @@ module RackDelegation
extend ActiveSupport::Concern
included do
delegate :session, :to => "@_request"
delegate :headers, :status=, :location=, :content_type=,
:status, :location, :content_type, :to => "@_response"
attr_internal :request
end
def dispatch(action, env)
@_request = ActionDispatch::Request.new(env)
def dispatch(action, request)
@_response = ActionDispatch::Response.new
@_response.request = request
super
......
......@@ -6,7 +6,8 @@ def initialize(controller, app)
end
def call(env)
@controller.build(@app).dispatch(:index, env)
request = ActionDispatch::Request.new(env)
@controller.build(@app).dispatch(:index, request)
end
end
......
......@@ -122,7 +122,11 @@ def active
find_all { |middleware| middleware.active? }
end
def build(app)
def build(app = nil, &blk)
app ||= blk
raise "MiddlewareStack#build requires an app" unless app
active.reverse.inject(app) { |a, e| e.build(a) }
end
end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册