Namespace

Module

Methods

Constants

RENDERERS = Set.new
 

A Set containing renderer names that correspond to available renderer procs. Default values are :json, :js, :xml.

Class Public methods

_render_with_renderer_method_name(key)

📝 Source code
# File actionpack/lib/action_controller/metal/renderers.rb, line 91
    def self._render_with_renderer_method_name(key)
      "_render_with_renderer_#{key}"
    end
🔎 See on GitHub

add(key, &block)

Adds a new renderer to call within controller actions. A renderer is invoked by passing its name as an option to AbstractController::Rendering#render. To create a renderer pass it a name and a block. The block takes two arguments, the first is the value paired with its key and the second is the remaining hash of options passed to render.

Create a csv renderer:

ActionController::Renderers.add :csv do |obj, options|
  filename = options[:filename] || 'data'
  str = obj.respond_to?(:to_csv) ? obj.to_csv : obj.to_s
  send_data str, type: Mime[:csv],
    disposition: "attachment; filename=#{filename}.csv"
end

Note that we used Mime for the csv mime type as it comes with Rails. For a custom renderer, you'll need to register a mime type with Mime::Type.register.

To use the csv renderer in a controller action:

def show
  @csvable = Csvable.find(params[:id])
  respond_to do |format|
    format.html
    format.csv { render csv: @csvable, filename: @csvable.name }
  end
end
📝 Source code
# File actionpack/lib/action_controller/metal/renderers.rb, line 75
    def self.add(key, &block)
      define_method(_render_with_renderer_method_name(key), &block)
      RENDERERS << key.to_sym
    end
🔎 See on GitHub

remove(key)

This method is the opposite of add method.

To remove a csv renderer:

ActionController::Renderers.remove(:csv)
📝 Source code
# File actionpack/lib/action_controller/metal/renderers.rb, line 85
    def self.remove(key)
      RENDERERS.delete(key.to_sym)
      method_name = _render_with_renderer_method_name(key)
      remove_possible_method(method_name)
    end
🔎 See on GitHub

Instance Public methods

_render_to_body_with_renderer(options)

📝 Source code
# File actionpack/lib/action_controller/metal/renderers.rb, line 145
    def _render_to_body_with_renderer(options)
      _renderers.each do |name|
        if options.key?(name)
          _process_options(options)
          method_name = Renderers._render_with_renderer_method_name(name)
          return send(method_name, options.delete(name), options)
        end
      end
      nil
    end
🔎 See on GitHub

render_to_body(options)

Called by render in AbstractController::Rendering which sets the return value as the response_body.

If no renderer is found, super returns control to ActionView::Rendering.render_to_body, if present.

📝 Source code
# File actionpack/lib/action_controller/metal/renderers.rb, line 141
    def render_to_body(options)
      _render_to_body_with_renderer(options) || super
    end
🔎 See on GitHub