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
- ._render_with_renderer_method_name(key) ⇒ Object
-
.add(key, &block) ⇒ Object
Adds a new renderer to call within controller actions.
-
.remove(key) ⇒ Object
This method is the opposite of add method.
Instance Method Summary collapse
- #_render_to_body_with_renderer(options) ⇒ Object
-
#render_to_body(options) ⇒ Object
Called by ‘render` in AbstractController::Rendering which sets the return value as the `response_body`.
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, |
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
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() _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) ⇒ 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() _render_to_body_with_renderer() || super end |