Spec-Zone.ru › Ruby on Rails 6.0

модуль ActionController::Renderers

Константы

RENDERERS

Множество, содержащее имена обработчиков, которые соответствуют доступным обработчикам procs. Значения по умолчанию — :json, :js, :xml.

Публичные методы класса

_render_with_renderer_method_name(key) Показать исходный код
# 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) Показать исходный код
# 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

Добавляет новый обработчик для вызова в действиях контроллера. Обработчик вызывается путем передачи его имени в качестве параметра 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
remove(key) Показать исходный код
# 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

Этот метод является противоположностью методу add.

Чтобы удалить обработчик csv:

ActionController::Renderers.remove(:csv)

Публичные методы экземпляра

_render_to_body_with_renderer(options) Показать исходный код
# File actionpack/lib/action_controller/metal/renderers.rb, line 145
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
render_to_body(options) Показать исходный код
# File actionpack/lib/action_controller/metal/renderers.rb, line 141
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–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API