module ActionController::Renderers
Constants
A Set containing renderer names that correspond to available renderer procs. Default values are :json
, :js
, :xml
.
Set.new
Public class methods
Source code GitHub
# File actionpack/lib/action_controller/metal/renderers.rb, line 89
def self._render_with_renderer_method_name(key)
"_render_with_renderer_#{key}"
end
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 GitHub
# File actionpack/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
This method is the opposite of add method.
To remove a csv renderer:
ActionController::Renderers.remove(:csv)
Source code GitHub
# File actionpack/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
Public instance methods
Source code GitHub
# File actionpack/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
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 GitHub
# File actionpack/lib/action_controller/metal/renderers.rb, line 139
def render_to_body(options)
_render_to_body_with_renderer(options) || super
end