# class ActionController::Metal

`ActionController::Metal` is the simplest possible controller, providing a valid Rack interface without the additional niceties provided by `ActionController::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`:

    match 'hello', :to => HelloController.action(:index)

The `action` method returns a valid Rack application for the Rails router to dispatch to.

## Rendering Helpers¶ ↑

`ActionController::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 ActionController::Rendering
      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 `ActionController::Base` to see other features you can bring into your metal controller.

### Public Class Methods

action(name, klass = ActionDispatch::Request) click to toggle source

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` - An action name

#### Returns¶ ↑

- `proc` - A rack application

    # File lib/action_controller/metal.rb, line 244
    def self.action(name, klass = ActionDispatch::Request)
      middleware_stack.build(name.to_s) do |env|
        new.dispatch(name, klass.new(env))
      end
    end

call(env) click to toggle source

Makes the controller a rack endpoint that points to the action in the given env’s action_dispatch.request.path_parameters key.

    # File lib/action_controller/metal.rb, line 231
    def self.call(env)
      action(env['action_dispatch.request.path_parameters'][:action]).call(env)
    end

controller_name() click to toggle source

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 lib/action_controller/metal.rb, line 116
    def self.controller_name
      @controller_name ||= self.name.demodulize.sub(/Controller$/, '').underscore
    end

middleware() click to toggle source

Alias for middleware_stack

    # File lib/action_controller/metal.rb, line 225
    def self.middleware
      middleware_stack
    end

new() click to toggle source
Calls superclass method

    # File lib/action_controller/metal.rb, line 134
    def initialize
      @_headers = {"Content-Type" => "text/html"}
      @_status = 200
      @_request = nil
      @_response = nil
      @_routes = nil
      super
    end

use(*args, &block) click to toggle source

Adds given middleware class and its args to bottom of middleware_stack

    # File lib/action_controller/metal.rb, line 220
    def self.use(*args, &block)
      middleware_stack.use(*args, &block)
    end

### Public Instance Methods

content_type() click to toggle source

    # File lib/action_controller/metal.rb, line 159
    def content_type
      headers["Content-Type"]
    end

content_type=(type) click to toggle source

Basic implementations for #content_type=, location=, and headers are provided to reduce the dependency on the RackDelegation module in Renderer and Redirector.

    # File lib/action_controller/metal.rb, line 155
    def content_type=(type)
      headers["Content-Type"] = type.to_s
    end

controller_name() click to toggle source

Delegates to the class’ `controller_name`

    # File lib/action_controller/metal.rb, line 121
    def controller_name
      self.class.controller_name
    end

env() click to toggle source

    # File lib/action_controller/metal.rb, line 106
    def env
      @_env ||= {}
    end

location() click to toggle source

    # File lib/action_controller/metal.rb, line 163
    def location
      headers["Location"]
    end

location=(url) click to toggle source

    # File lib/action_controller/metal.rb, line 167
    def location=(url)
      headers["Location"] = url
    end

params() click to toggle source

    # File lib/action_controller/metal.rb, line 143
    def params
      @_params ||= request.parameters
    end

params=(val) click to toggle source

    # File lib/action_controller/metal.rb, line 147
    def params=(val)
      @_params = val
    end

performed?() click to toggle source

    # File lib/action_controller/metal.rb, line 195
    def performed?
      response_body
    end

response_body=(val) click to toggle source
Calls superclass method

    # File lib/action_controller/metal.rb, line 184
    def response_body=(val)
      body = if val.is_a?(String)
        [val]
      elsif val.nil? || val.respond_to?(:each)
        val
      else
        [val]
      end
      super body
    end

status() click to toggle source

    # File lib/action_controller/metal.rb, line 176
    def status
      @_status
    end

status=(status) click to toggle source

    # File lib/action_controller/metal.rb, line 180
    def status=(status)
      @_status = Rack::Utils.status_code(status)
    end

url_for(string) click to toggle source

basic #url_for that can be overridden for more robust functionality

    # File lib/action_controller/metal.rb, line 172
    def url_for(string)
      string
    end