Module: ActionController::Renderers
| Relationships & Source Files | |
| Namespace Children | |
| Modules: | |
| Extension / Inclusion / Inheritance Descendants | |
| Included In: API,Base,All,::ActionView::TestCase::TestController,
          Rails::ApplicationController,
          Rails::InfoController,
          Rails::MailersController,
          Rails::WelcomeController | |
| Super Chains via Extension / Inclusion / Inheritance | |
| Class Chain: 
          self,
           ::ActiveSupport::Concern | |
| Defined in: | actionpack/lib/action_controller/metal/renderers.rb | 
Constant Summary
- 
    RENDERERS =
    # File 'actionpack/lib/action_controller/metal/renderers.rb', line 28A Set containing renderer names that correspond to available renderer procs. Default values are :json,:js,:xml.Set.new 
Class Method Summary
- ._render_with_renderer_method_name(key)
- 
    
      .add(key, &block)  
    
    Adds a new renderer to call within controller actions. 
- 
    
      .remove(key)  
    
    This method is the opposite of add method. 
::ActiveSupport::Concern - Extended
Instance Method Summary
- #_render_to_body_with_renderer(options)
- 
    
      #render_to_body(options)  
    
    Called by renderin::AbstractController::Renderingwhich sets the return value as theresponse_body.
DSL Calls
included
[ GitHub ]30 31 32
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 30
included do class_attribute :_renderers, default: Set.new.freeze end
Class Method Details
._render_with_renderer_method_name(key)
[ GitHub ]# File 'actionpack/lib/action_controller/metal/renderers.rb', line 91
def self._render_with_renderer_method_name(key) "_render_with_renderer_#{key}" end
.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.
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"
endNote 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# File 'actionpack/lib/action_controller/metal/renderers.rb', line 75
def self.add(key, &block) define_method(_render_with_renderer_method_name(key), &block) RENDERERS << key.to_sym end
.remove(key)
This method is the opposite of add method.
To remove a csv renderer:
ActionController::Renderers.remove(:csv)# File 'actionpack/lib/action_controller/metal/renderers.rb', line 85
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)
[ GitHub ]# File 'actionpack/lib/action_controller/metal/renderers.rb', line 145
def _render_to_body_with_renderer() _renderers.each do |name| if .key?(name) () method_name = Renderers._render_with_renderer_method_name(name) return send(method_name, .delete(name), ) end end nil end
#render_to_body(options)
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.
# File 'actionpack/lib/action_controller/metal/renderers.rb', line 141
def render_to_body() _render_to_body_with_renderer() || super end