class ActionController::Metal - actionpack-4.2.3 Documentation

# 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`:

    get '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 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 `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

Returns a Rack endpoint for the given action name.

    # File lib/action_controller/metal.rb, line 231
    def self.action(name, klass = ActionDispatch::Request)
      if middleware_stack.any?
        middleware_stack.build(name) do |env|
          new.dispatch(name, klass.new(env))
        end
      else
        lambda { |env| new.dispatch(name, klass.new(env)) }
      end
    end

call(env) click to toggle source

Makes the controller a Rack endpoint that runs the action in the given `env`'s `action_dispatch.request.path_parameters` key.

    # File lib/action_controller/metal.rb, line 225
    def self.call(env)
      req = ActionDispatch::Request.new env
      action(req.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 113
    def self.controller_name
      @controller_name ||= name.demodulize.sub(/Controller$/, '').underscore
    end

middleware() click to toggle source

Alias for `middleware_stack`.

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

new() click to toggle source
Calls superclass method

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

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

Pushes the given Rack middleware and its arguments to the bottom of the middleware stack.

    # File lib/action_controller/metal.rb, line 214
    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 156
    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 152
    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 118
    def controller_name
      self.class.controller_name
    end

env() click to toggle source

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

location() click to toggle source

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

location=(url) click to toggle source

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

params() click to toggle source

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

params=(val) click to toggle source

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

performed?() click to toggle source

Tests if render or redirect has already happened.

    # File lib/action_controller/metal.rb, line 188
    def performed?
      response_body || (response && response.committed?)
    end

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

    # File lib/action_controller/metal.rb, line 182
    def response_body=(body)
      body = [body] unless body.nil? || body.respond_to?(:each)
      super
    end

response_code()
Alias for: status
status() click to toggle source

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

Also aliased as: response_code
status=(status) click to toggle source

    # File lib/action_controller/metal.rb, line 178
    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 169
    def url_for(string)
      string
    end