123456789_123456789_123456789_123456789_123456789_

Module: ActionController::Renderers

Relationships & Source Files
Namespace Children
Modules:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: actionpack/lib/action_controller/metal/renderers.rb

Constant Summary

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

append_features, prepend_features

Instance Method Summary

DSL Calls

included

[ GitHub ]


32
33
34
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 32

included do
  class_attribute :_renderers, default: Set.new.freeze
end

Class Method Details

._render_with_renderer_method_name(key)

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 91

def self._render_with_renderer_method_name(key)
  "_render_with_renderer_#{key}"
end

.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](:csv) 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
[ GitHub ]

  
# 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

.remove(key)

This method is the opposite of add method.

To remove a csv renderer:

ActionController::Renderers.remove(:csv)
[ GitHub ]

  
# 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

Instance Method Details

#_render_to_body_with_renderer(options)

[ GitHub ]

  
# 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

#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.

[ GitHub ]

  
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 141

def render_to_body(options)
  _render_to_body_with_renderer(options) || super
end