Spec-Zone.ru › Ruby on Rails 8.1

класс AbstractController::Base

Родительский класс:
Object

Абстрактный контроллер Base

AbstractController::Base — это низкоуровневый API. Никто не должен использовать его напрямую, а подклассы (например, ActionController::Base) должны предоставлять собственный метод render, поскольку смысл рендеринга зависит от контекста.

Атрибуты

abstract [R]
abstract? [R]

Общедоступные методы класса

abstract! () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 57
def abstract!
  @abstract = true
end

Объявляет контроллер абстрактным. Подробнее см. internal_methods.

action_methods () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 93
def action_methods
  @action_methods ||= begin
    # All public instance methods of this class, including ancestors except for
    # public instance methods of Base and its ancestors.
    methods = public_instance_methods(true) - internal_methods
    methods.map!(&:name)
    methods.to_set
  end
end

Set имён методов, которые следует считать действиями. Сюда входят все общедоступные методы экземпляра контроллера, кроме внутренних методов (см. internal_methods), а также методы, которые являются внутренними, но всё ещё существуют в самом классе.

clear_action_methods! () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 106
def clear_action_methods!
  @action_methods = nil
end

action_methods кэшируются, и иногда их необходимо обновить. ::clear_action_methods! позволяет сделать это, чтобы при следующем вызове action_methods они были пересчитаны.

controller_path () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 118
def controller_path
  @controller_path ||= name.delete_suffix("Controller").underscore unless anonymous?
end

Возвращает полное имя контроллера в формате snake_case, без завершающей части Controller.

class MyApp::MyPostsController < AbstractController::Base

end

MyApp::MyPostsController.controller_path # => "my_app/my_posts"
internal_methods () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 77
def internal_methods
  controller = self
  methods = []

  until controller.abstract?
    methods += controller.public_instance_methods(false)
    controller = controller.superclass
  end

  controller.public_instance_methods(true) - methods
end

Список всех внутренних методов контроллера. Метод находит первый абстрактный суперкласс контроллера и получает список всех общедоступных методов экземпляра этого абстрактного класса. Общедоступные методы экземпляра контроллера обычно считаются методами действий, поэтому методы, объявленные в абстрактных классах, исключаются. (ActionController::Metal и ActionController::Base объявлены абстрактными.)

method_added (name) Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 127
def method_added(name)
  super
  clear_action_methods!
end

Обновляет кэш action_methods при добавлении нового action_method.

Вызывает метод суперкласса
supports_path? () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 191
def self.supports_path?
  true
end

Возвращает true, если данный контроллер способен рендерить путь. Подкласс AbstractController::Base может вернуть false. Например, контроллер электронной почты не поддерживает пути, а только полные URL.

Общедоступные методы экземпляра

action_methods () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 163
def action_methods
  self.class.action_methods
end

Делегирует вызов методу класса ::action_methods.

action_name () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 43
attr_internal :action_name

Возвращает имя действия, которое обрабатывает этот контроллер.

available_action? (action_name) Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 178
def available_action?(action_name)
  _find_action_name(action_name)
end

Возвращает true, если метод для действия доступен и может быть вызван, и false в противном случае.

Обратите внимание: action_methods.include?("foo") может вернуть false, а available_action?("foo") — true, поскольку этот метод учитывает действия, доступные и другими способами, например, через неявный рендеринг.

Параметры

  • action_name — имя проверяемого действия

controller_path () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 158
def controller_path
  self.class.controller_path
end

Делегирует вызов методу класса ::controller_path.

formats () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 47
attr_internal :formats

Возвращает форматы, которые может обрабатывать контроллер.

performed? () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 184
def performed?
  response_body
end

Проверяет, задано ли тело ответа. Используется, чтобы определить, нужно ли завершить callback process_action в AbstractController::Callbacks.

process (action, ...) Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 145
def process(action, ...)
  @_action_name = action.to_s

  unless action_name = _find_action_name(@_action_name)
    raise ActionNotFound.new("The action '#{action}' could not be found for #{self.class.name}", self, action)
  end

  @_response_body = nil

  process_action(action_name, ...)
end

Вызывает действие, проходя через весь стек Action Dispatch.

Вызываемый метод определяется вызовом method_for_action. Если ни один метод не может обработать действие, возникает ошибка AbstractController::ActionNotFound.

response_body () Показать исходный код
# File actionpack/lib/abstract_controller/base.rb, line 39
attr_internal :response_body

Возвращает тело HTTP-ответа, отправленного контроллером.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

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