ActionController::Metal provides a way to get a valid Rack application from a controller.
In AbstractController, dispatching is triggered directly by calling process on a new controller. ActionController::Metal provides an #action method that returns a valid Rack application for a given action. Other rack builders, such as Rack::Builder, Rack::URLMap, and the Rails router, can dispatch directly to the action returned by FooController.action(:index).
- action
- call
- content_type
- content_type=
- controller_name
- controller_name
- dispatch
- inherited
- location
- location=
- middleware
- new
- params
- params=
- response_body=
- status
- status=
- to_a
- url_for
- use
Return a rack endpoint for the given action. Memoize the endpoint, so multiple calls into MyController.action will return the same object for the same action.
Parameters
action<#to_s> |
An action name |
Returns
Proc |
A rack application |
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 176 def self.action(name, klass = ActionDispatch::Request) middleware_stack.build(name.to_s) do |env| new.dispatch(name, klass.new(env)) end end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 163 def self.call(env) action(env['action_dispatch.request.path_parameters'][:action]).call(env) end
Returns the last part of the controller’s name, underscored, without the ending “Controller”. For instance, MyApp::MyPostsController would return “my_posts” for controller_name
Returns
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 63 def self.controller_name @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 150 def self.inherited(base) base.middleware_stack = self.middleware_stack.dup super end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 159 def self.middleware middleware_stack end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 81 def initialize(*) @_headers = {"Content-Type" => "text/html"} @_status = 200 super end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 155 def self.use(*args, &block) middleware_stack.use(*args, &block) end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 103 def content_type headers["Content-Type"] end
Basic implementations for content_type=, location=, and headers are provided to reduce the dependency on the RackDelegation module in Renderer and Redirector.
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 99 def content_type=(type) headers["Content-Type"] = type.to_s end
Delegates to the class’ controller_name
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 68 def controller_name self.class.controller_name end
:api: private
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 134 def dispatch(name, request) @_request = request @_env = request.env @_env['action_controller.instance'] = self process(name) to_a end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 107 def location headers["Location"] end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 111 def location=(url) headers["Location"] = url end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 87 def params @_params ||= request.parameters end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 91 def params=(val) @_params = val end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 128 def response_body=(val) body = val.respond_to?(:each) ? val : [val] super body end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 120 def status @_status end
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 124 def status=(status) @_status = Rack::Utils.status_code(status) end
:api: private
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 143 def to_a response ? response.to_a : [status, headers, response_body] end
basic url_for that can be overridden for more robust functionality
[ show source ]
# File actionpack/lib/action_controller/metal.rb, line 116 def url_for(string) string end