Module: ActionController::Renderers

Extended by:
ActiveSupport::Concern
Included in:
All
Defined in:
actionpack/lib/action_controller/metal/renderers.rb

Defined Under Namespace

Modules: All, ClassMethods

Constant Summary collapse

RENDERERS =

Hash of available renderers, mapping a renderer name to its proc. Default keys are :json, :js, :xml.

Set.new

Class Method Summary collapse

Instance Method Summary collapse

Methods included from ActiveSupport::Concern

append_features, extended, included

Class Method Details

.add(key, &block) ⇒ Object

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

To use renderers and their mime types in more concise ways, see ActionController::MimeResponds::ClassMethods.respond_to and ActionController::MimeResponds#respond_with



75
76
77
78
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 75

def self.add(key, &block)
  define_method("_render_option_#{key}", &block)
  RENDERERS << key.to_sym
end

Instance Method Details

#_handle_render_options(options) ⇒ Object



29
30
31
32
33
34
35
36
37
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 29

def _handle_render_options(options)
  _renderers.each do |name|
    if options.key?(name)
      _process_options(options)
      return send("_render_option_#{name}", options.delete(name), options)
    end
  end
  nil
end

#render_to_body(options) ⇒ Object



25
26
27
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 25

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