класс AbstractController::Base
Абстрактный контроллер Base
AbstractController::Base — это низкоуровневый API. Никто не должен использовать его напрямую, а подклассы (например, ActionController::Base) должны предоставлять собственный метод render, поскольку смысл рендеринга зависит от контекста.
Атрибуты
Общедоступные методы класса
# File actionpack/lib/abstract_controller/base.rb, line 57 def abstract! @abstract = true end
Объявляет контроллер абстрактным. Подробнее см. internal_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), а также методы, которые являются внутренними, но всё ещё существуют в самом классе.
# File actionpack/lib/abstract_controller/base.rb, line 106 def clear_action_methods! @action_methods = nil end
action_methods кэшируются, и иногда их необходимо обновить. ::clear_action_methods! позволяет сделать это, чтобы при следующем вызове action_methods они были пересчитаны.
# 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"
# 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 объявлены абстрактными.)
# File actionpack/lib/abstract_controller/base.rb, line 127 def method_added(name) super clear_action_methods! end
Обновляет кэш action_methods при добавлении нового action_method.
# File actionpack/lib/abstract_controller/base.rb, line 191 def self.supports_path? true end
Возвращает true, если данный контроллер способен рендерить путь. Подкласс AbstractController::Base может вернуть false. Например, контроллер электронной почты не поддерживает пути, а только полные URL.
Общедоступные методы экземпляра
# File actionpack/lib/abstract_controller/base.rb, line 163 def action_methods self.class.action_methods end
Делегирует вызов методу класса ::action_methods.
# File actionpack/lib/abstract_controller/base.rb, line 43 attr_internal :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— имя проверяемого действия
# File actionpack/lib/abstract_controller/base.rb, line 158 def controller_path self.class.controller_path end
Делегирует вызов методу класса ::controller_path.
# File actionpack/lib/abstract_controller/base.rb, line 47 attr_internal :formats
Возвращает форматы, которые может обрабатывать контроллер.
# File actionpack/lib/abstract_controller/base.rb, line 184 def performed? response_body end
Проверяет, задано ли тело ответа. Используется, чтобы определить, нужно ли завершить callback process_action в AbstractController::Callbacks.
# 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.
# File actionpack/lib/abstract_controller/base.rb, line 39 attr_internal :response_body
Возвращает тело HTTP-ответа, отправленного контроллером.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.