Module: ActionController::Renderers
- Extended by:
- ActiveSupport::Concern
- Defined in:
- actionpack/lib/action_controller/metal/renderers.rb
Defined Under Namespace
Modules: All, ClassMethods
Constant Summary
- RENDERERS =
Hash of available renderers, mapping a renderer name to its proc. Default keys are :json, :js, :xml.
{}
Class Method Summary (collapse)
-
+ (Object) add(key, &block)
Adds a new renderer to call within controller actions.
Instance Method Summary (collapse)
Methods included from ActiveSupport::Concern
append_features, extended, included
Class Method Details
+ (Object) 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.
Example
Create a csv renderer:
ActionController::Renderers.add :csv do |obj, |
filename = [: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
80 81 82 83 |
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 80 def self.add(key, &block) define_method("_render_option_#{key}", &block) RENDERERS[key] = block end |
Instance Method Details
- (Object) _handle_render_options(options)
33 34 35 36 37 38 39 40 41 |
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 33 def () _renderers.each do |name, value| if .key?(name.to_sym) () return send("_render_option_#{name}", .delete(name.to_sym), ) end end nil end |
- (Object) render_to_body(options)
29 30 31 |
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 29 def render_to_body() () || super end |