модуль ActionController::Renderers
Константы
- RENDERERS
-
Множество, содержащее имена рендереров, соответствующие доступным процедурам рендеринга. Значения по умолчанию —
:json,:js,:xml.
Публичные методы класса
# File actionpack/lib/action_controller/metal/renderers.rb, line 90
def self._render_with_renderer_method_name(key)
"_render_with_renderer_#{key}"
end # File actionpack/lib/action_controller/metal/renderers.rb, line 74 def self.add(key, &block) define_method(_render_with_renderer_method_name(key), &block) RENDERERS << key.to_sym end
Добавляет новый рендер для вызова в действиях контроллера.
Рендер вызывается, передавая его имя в качестве параметра AbstractController::Rendering#render.
Для создания рендера передайте ему имя и блок. Блок принимает два аргумента: первый — значение, связанное с его ключом, а второй — остальную часть хэша параметров, переданных render.
Создайте рендер csv:
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
Обратите внимание, что мы использовали Mime для типа mime csv, так как он входит в состав Rails. Для пользовательского рендера вам необходимо зарегистрировать тип mime с помощью Mime::Type.register.
Для использования рендера csv в действии контроллера:
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 84 def self.remove(key) RENDERERS.delete(key.to_sym) method_name = _render_with_renderer_method_name(key) remove_possible_method(method_name) end
Этот метод является противоположностью методу add.
Чтобы удалить рендер csv:
ActionController::Renderers.remove(:csv)
Публичные методы экземпляра
# File actionpack/lib/action_controller/metal/renderers.rb, line 144
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 # File actionpack/lib/action_controller/metal/renderers.rb, line 140 def render_to_body(options) _render_to_body_with_renderer(options) || super end
Вызывается render в AbstractController::Rendering, который устанавливает возвращаемое значение в качестве response_body.
Если рендер не найден, super возвращает управление методу ActionView::Rendering.render_to_body, если он присутствует.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.