Module: ActionController::Renderers

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

Defined Under Namespace

Modules: All, ClassMethods

Constant Summary collapse

RENDERERS =

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

Set.new

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

._render_with_renderer_method_name(key) ⇒ Object



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

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

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


73
74
75
76
# File 'lib/action_controller/metal/renderers.rb', line 73

def self.add(key, &block)
  define_method(_render_with_renderer_method_name(key), &block)
  RENDERERS << key.to_sym
end

.remove(key) ⇒ Object

This method is the opposite of add method.

To remove a csv renderer:

ActionController::Renderers.remove(:csv)


83
84
85
86
87
# File 'lib/action_controller/metal/renderers.rb', line 83

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) ⇒ Object



143
144
145
146
147
148
149
150
151
152
# File 'lib/action_controller/metal/renderers.rb', line 143

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) ⇒ Object

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.



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

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