Class: ActionController::Metal
Relationships & Source Files | |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
|
|
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
By default, Metal
provides no utilities for rendering views, partials, or other responses aside from some low-level setters such as #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
The middleware stack used by this controller.
- .new ⇒ Metal constructor
-
.use
Pushes the given
::Rack
middleware and its arguments to the bottom of the middleware stack. - .inherited(subclass) private
- .action_encoding_template(action) Internal use only
::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. |
.eager_load!, .inherited |
::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
:attr_reader: request.
-
#response
rw
:attr_reader: response.
-
#response=(response)
rw
Assign the response and mark it as committed.
- #response_body=(body) writeonly
- #session readonly
- #status (also: #response_code) rw
-
#response_code
readonly
Internal use only
Alias for #status.
::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’s .controller_name.
- #reset_session
-
#url_for(string)
Basic #url_for that can be overridden for more robust functionality.
- #dispatch(name, request, response) Internal use only
- #set_request!(request) Internal use only
- #set_response!(response) Internal use only
- #to_a Internal use only
Testing::Functional
- Included
::AbstractController::Base
- Inherited
#action_methods | Delegates to the class’s |
#available_action? | Returns true if a method for the action is available and can be dispatched, false otherwise. |
#controller_path | Delegates to the class’s |
#process | Calls the action going through the entire Action Dispatch stack. |
#_find_action_name | Takes an action name and returns the name of the method that will handle the action. |
#_handle_action_missing | If the action name was not found, but a method called “action_missing” was found, |
#_valid_action_name? | Checks if the action name is valid and returns false otherwise. |
#action_method? | Returns true if the name can be considered an action because it has a method defined in the controller. |
#method_for_action | Takes an action name and returns the name of the method that will handle the action. |
#process_action | Call the action. |
#send_action | Actually call the method associated with the action. |
#inspect |
::ActiveSupport::Configurable
- Included
#config | Reads and writes attributes from a configuration OrderedOptions. |
Constructor Details
.new ⇒ Metal
# File 'actionpack/lib/action_controller/metal.rb', line 210
def initialize @_request = nil @_response = nil @_response_body = nil @_routes = nil @_params = nil super end
Class Attribute Details
.middleware_stack (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 288
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
.middleware_stack? ⇒ Boolean
(rw)
[ GitHub ]
# File 'actionpack/lib/action_controller/metal.rb', line 288
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 315
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
.action_encoding_template(action)
# File 'actionpack/lib/action_controller/metal.rb', line 140
def self.action_encoding_template(action) # :nodoc: false 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 130
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 331
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
.inherited(subclass) (private)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 146
def inherited(subclass) super subclass.middleware_stack = middleware_stack.dup subclass.class_eval do @controller_name = nil end end
.make_response!(request)
[ GitHub ].middleware
The middleware stack used by this controller.
By default uses a variation of ::ActionDispatch::MiddlewareStack
which allows for the following syntax:
class PostsController < ApplicationController
use AuthenticationMiddleware, except: [:index, :show]
end
Read more about [Rails middleware stack] (guides.rubyonrails.org/rails_on_rack.html#action-dispatcher-middleware-stack) in the guides.
# File 'actionpack/lib/action_controller/metal.rb', line 310
def self.middleware middleware_stack end
.use
Pushes the given ::Rack
middleware and its arguments to the bottom of the middleware stack.
# File 'actionpack/lib/action_controller/metal.rb', line 293
def use(...) middleware_stack.use(...) end
Instance Attribute Details
#content_type (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 204
delegate :content_type, to: "@_response"
#headers (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 180
delegate :headers, to: "@_response"
#location (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 200
delegate :location, to: "@_response"
#media_type (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 208
delegate :media_type, to: "@_response"
#middleware_stack (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 288
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
#middleware_stack? ⇒ Boolean
(rw)
[ GitHub ]
# File 'actionpack/lib/action_controller/metal.rb', line 288
class_attribute :middleware_stack, default: ActionController::MiddlewareStack.new
#params (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 219
def params @_params ||= request.parameters end
#params=(val) (rw)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 223
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 245
def performed? response_body || response.committed? end
#request (rw)
:attr_reader: request
The ::ActionDispatch::Request
instance for the current request.
# File 'actionpack/lib/action_controller/metal.rb', line 164
attr_internal :request
#response (rw)
:attr_reader: response
The ::ActionDispatch::Response
instance for the current response.
# File 'actionpack/lib/action_controller/metal.rb', line 170
attr_internal_reader :response
#response=(response) (rw)
Assign the response and mark it as committed. No further processing will occur.
# File 'actionpack/lib/action_controller/metal.rb', line 268
def response=(response) set_response!(response) # Force `performed?` to return true: @_response_body = true end
#response_body=(body) (writeonly)
[ GitHub ]#response_code (readonly)
Alias for #status.
# File 'actionpack/lib/action_controller/metal.rb', line 227
alias :response_code :status # :nodoc:
#session (readonly)
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 176
delegate :session, to: "@_request"
#status (rw) Also known as: #response_code
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 196
delegate :status, to: "@_response"
Instance Method Details
#controller_name
Delegates to the class’s .controller_name.
# File 'actionpack/lib/action_controller/metal.rb', line 156
def controller_name self.class.controller_name end
#dispatch(name, request, response)
# File 'actionpack/lib/action_controller/metal.rb', line 249
def dispatch(name, request, response) # :nodoc: set_request!(request) set_response!(response) process(name) request.commit_flash to_a end
#reset_session
[ GitHub ]# File 'actionpack/lib/action_controller/metal.rb', line 284
def reset_session @_request.reset_session end
#set_request!(request)
#set_response!(response)
#to_a
# File 'actionpack/lib/action_controller/metal.rb', line 280
def to_a # :nodoc: response.to_a end
#url_for(string)
Basic url_for
that can be overridden for more robust functionality.
# File 'actionpack/lib/action_controller/metal.rb', line 230
def url_for(string) string end