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
endAnd 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
endRedirection 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
endOther 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. | 
| .config, | |
| .supports_path? | Returns true if the given controller is capable of rendering a path. | 
Class Method Summary
- 
    
      .action(name)  
    
    Returns a ::Rackendpoint 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 ::Rackmiddleware 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  | 
| .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. | 
| .configure, .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. | 
| #config=, | |
| #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. | 
| #config | |
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 | |
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]
endRead 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