Class: ActionController::Metal
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
API, Base, Rails::ApplicationController, Rails::InfoController, Rails::MailersController, Rails::WelcomeController, ActionView::TestCase::TestController
|
|
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
|
|
Instance Chain:
|
|
Inherits: |
AbstractController::Base
|
Defined in: | actionpack/lib/action_controller/metal.rb, actionpack/lib/action_controller/test_case.rb |
Overview
Metal
is the simplest possible controller, providing a valid ::Rack
interface without the additional niceties provided by Base
.
A sample metal controller might look like this:
class HelloController < ActionController::Metal
def index
self.response_body = "Hello World!"
end
end
And then to route requests to your metal controller, you would add something like this to config/routes.rb
:
get 'hello', to: HelloController.action(:index)
The .action method returns a valid ::Rack
application for the Rails router to dispatch to.
Rendering Helpers
Metal
by default provides no utilities for rendering views, partials, or other responses aside from explicitly calling of #response_body=, #content_type=, and #status=. To add the render helpers you’re used to having in a normal controller, you can do the following:
class HelloController < ActionController::Metal
include AbstractController::Rendering
include ActionView::Layouts
append_view_path "#{Rails.root}/app/views"
def index
render "hello/index"
end
end
Redirection Helpers
To add redirection helpers to your metal controller, do the following:
class HelloController < ActionController::Metal
include ActionController::Redirecting
include Rails.application.routes.url_helpers
def index
redirect_to root_url
end
end
Other Helpers
You can refer to the modules included in Base
to see other features you can bring into your metal controller.
Class Attribute Summary
::AbstractController::Base
- Inherited
.abstract? | Alias for AbstractController::Base.abstract. |
.supports_path? | Returns true if the given controller is capable of rendering a path. |
Class Method Summary
-
.action(name)
Returns a
::Rack
endpoint for the given action name. -
.controller_name
Returns the last part of the controller’s name, underscored, without the ending
Controller
. -
.dispatch(name, req, res)
Direct dispatch to the controller.
- .make_response!(request)
-
.middleware
Alias for .middleware_stack.
- .new ⇒ Metal constructor
-
.use(*args, &block)
Pushes the given
::Rack
middleware and its arguments to the bottom of the middleware stack.
::AbstractController::Base
- Inherited
.abstract, | |
.abstract! | Define a controller as abstract. |
.action_methods | A list of method names that should be considered actions. |
.clear_action_methods! | action_methods are cached and there is sometimes a need to refresh them. |
.controller_path | Returns the full controller name, underscored, without the ending Controller. |
.internal_methods | A list of all internal methods for a controller. |
.method_added | Refresh the cached action_methods when a new action_method is added. |
::ActiveSupport::DescendantsTracker
- Extended
Instance Attribute Summary
- #content_type rw
- #headers readonly
- #location rw
- #media_type readonly
- #middleware_stack rw
- #middleware_stack? ⇒ Boolean rw
- #params rw
- #params=(val) rw
-
#performed? ⇒ Boolean
readonly
Tests if render or redirect has already happened.
- #request rw
- #response rw
- #response_body=(body) writeonly
- #session readonly
- #status (also: #response_code) rw
::AbstractController::Base
- Inherited
#action_name | Returns the name of the action this controller is processing. |
#formats | Returns the formats that can be processed by the controller. |
#performed? | Tests if a response body is set. |
#response_body | Returns the body of the HTTP response sent by the controller. |
Instance Method Summary
-
#controller_name
Delegates to the class’
controller_name
. - #reset_session
-
#url_for(string)
Basic url_for that can be overridden for more robust functionality.
::AbstractController::Base
- Inherited
#action_methods | Delegates to the class’ |
#available_action? | Returns true if a method for the action is available and can be dispatched, false otherwise. |
#controller_path | Delegates to the class’ |
#process | Calls the action going through the entire action dispatch stack. |
::ActiveSupport::Configurable
- Included
#config | Reads and writes attributes from a configuration |
Constructor Details
.new ⇒ Metal
# File 'actionpack/lib/action_controller/metal.rb', line 152
def initialize @_request = nil @_response = nil @_routes = nil super end
Class Attribute Details
.middleware_stack (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 212
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
.middleware_stack? ⇒ Boolean
(rw)
[ GitHub ]
# File 'actionpack/lib/action_controller/metal.rb', line 212
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
Class Method Details
.action(name)
Returns a ::Rack
endpoint for the given action name.
# File 'actionpack/lib/action_controller/metal.rb', line 234
def self.action(name) app = lambda { |env| req = ActionDispatch::Request.new(env) res = make_response! req new.dispatch(name, req, res) } if middleware_stack.any? middleware_stack.build(name, app) else app end end
.controller_name
Returns the last part of the controller’s name, underscored, without the ending Controller
. For instance, PostsController returns posts
. Namespaces are left out, so Admin::PostsController
returns posts
as well.
Returns
-
string
# File 'actionpack/lib/action_controller/metal.rb', line 128
def self.controller_name @controller_name ||= (name.demodulize.delete_suffix("Controller").underscore unless anonymous?) end
.dispatch(name, req, res)
Direct dispatch to the controller. Instantiates the controller, then executes the action named name
.
# File 'actionpack/lib/action_controller/metal.rb', line 250
def self.dispatch(name, req, res) if middleware_stack.any? middleware_stack.build(name) { |env| new.dispatch(name, req, res) }.call req.env else new.dispatch(name, req, res) end end
.make_response!(request)
[ GitHub ].middleware
Alias for .middleware_stack.
# File 'actionpack/lib/action_controller/metal.rb', line 229
def self.middleware middleware_stack end
.use(*args, &block)
Pushes the given ::Rack
middleware and its arguments to the bottom of the middleware stack.
# File 'actionpack/lib/action_controller/metal.rb', line 222
def use(*args, &block) middleware_stack.use(*args, &block) end
Instance Attribute Details
#content_type (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 149
delegate :headers, :status=, :location=, :content_type=, :status, :location, :content_type, :media_type, to: "@_response"
#headers (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 149
delegate :headers, :status=, :location=, :content_type=, :status, :location, :content_type, :media_type, to: "@_response"
#location (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 149
delegate :headers, :status=, :location=, :content_type=, :status, :location, :content_type, :media_type, to: "@_response"
#media_type (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 149
delegate :headers, :status=, :location=, :content_type=, :status, :location, :content_type, :media_type, to: "@_response"
#middleware_stack (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 212
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
#middleware_stack? ⇒ Boolean
(rw)
[ GitHub ]
# File 'actionpack/lib/action_controller/metal.rb', line 212
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
#params (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 159
def params @_params ||= request.parameters end
#params=(val) (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 163
def params=(val) @_params = val end
#performed? ⇒ Boolean
(readonly)
Tests if render or redirect has already happened.
# File 'actionpack/lib/action_controller/metal.rb', line 183
def performed? response_body || response.committed? end
#request (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 147
attr_internal :response, :request
#response (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 147
attr_internal :response, :request
#response_body=(body) (writeonly)
[ GitHub ]#session (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 148
delegate :session, to: "@_request"
#status (rw) Also known as: #response_code
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 149
delegate :headers, :status=, :location=, :content_type=, :status, :location, :content_type, :media_type, to: "@_response"
Instance Method Details
#controller_name
Delegates to the class’ controller_name
.
# File 'actionpack/lib/action_controller/metal.rb', line 143
def controller_name self.class.controller_name end
#reset_session
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 208
def reset_session @_request.reset_session end
#url_for(string)
Basic url_for that can be overridden for more robust functionality.
# File 'actionpack/lib/action_controller/metal.rb', line 170
def url_for(string) string end