module ActionController::Renderers
Constants
- RENDERERS
-
Hash of available renderers, mapping a renderer name to its proc. Default keys are
:json
,:js
,:xml
.
Public Class Methods
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
# File actionpack/lib/action_controller/metal/renderers.rb, line 81 def self.add(key, &block) define_method("_render_option_#{key}", &block) RENDERERS << key.to_sym end
Public Instance Methods
# File actionpack/lib/action_controller/metal/renderers.rb, line 35 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
# File actionpack/lib/action_controller/metal/renderers.rb, line 31 def render_to_body(options) _handle_render_options(options) || super end
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.