класс AbstractController::Base
AbstractController::Base — это низкоуровневый API. Никто не должен использовать его напрямую, а подклассы (например, ActionController::Base) должны предоставлять свои собственные render метод, поскольку отображение означает разные вещи в зависимости от контекста.
Атрибуты
Публичные методы класса
# File actionpack/lib/abstract_controller/base.rb, line 30 def abstract! @abstract = true end
Определить контроллер как абстрактный. См. ::internal_methods для получения дополнительной информации.
# File actionpack/lib/abstract_controller/base.rb, line 64
def action_methods
@action_methods ||= begin
# All public instance methods of this class, including ancestors
methods = (public_instance_methods(true) -
# Except for public instance methods of Base and its ancestors
internal_methods +
# Be sure to include shadowed public instance methods of this class
public_instance_methods(false)).uniq.map(&:to_s)
methods.to_set
end
end Список имён методов, которые должны рассматриваться как действия. Это включает все публичные методы экземпляра контроллера, за исключением внутренних методов (см. ::internal_methods), добавляя обратно любые методы, которые являются внутренними, но всё ещё существуют в классе.
Возвращает
-
Set— множество всех методов, которые следует рассматривать как действия.
# File actionpack/lib/abstract_controller/base.rb, line 80 def clear_action_methods! @action_methods = nil end
Методы ::action_methods кэшируются, и иногда возникает необходимость их обновления. ::clear_action_methods! позволяет это сделать, чтобы в следующий раз при выполнении ::action_methods они были пересчитаны.
# File actionpack/lib/abstract_controller/base.rb, line 94 def controller_path @controller_path ||= name.sub(/Controller$/, "".freeze).underscore unless anonymous? end
Возвращает полное имя контроллера, с нижними подчёркиваниями, без окончание Controller.
class MyApp::MyPostsController < AbstractController::Base end MyApp::MyPostsController.controller_path # => "my_app/my_posts"
Возвращает
-
String
# File actionpack/lib/abstract_controller/base.rb, line 49 def internal_methods controller = self controller = controller.superclass until controller.abstract? controller.public_instance_methods(true) end
Список всех внутренних методов для контроллера. Он находит первый абстрактный суперкласс контроллера и получает список всех публичных методов экземпляра этого абстрактного класса. Публичные методы экземпляра контроллера обычно считаются методами действий, поэтому методы, объявленные в абстрактных классах, удаляются. (ActionController::Metal и ActionController::Base определены как абстрактные)
# File actionpack/lib/abstract_controller/base.rb, line 99 def method_added(name) super clear_action_methods! end
Обновить кэшированные ::action_methods при добавлении нового метода действия.
# File actionpack/lib/abstract_controller/base.rb, line 162 def self.supports_path? true end
Возвращает true, если данный контроллер может отобразить путь. Подкласс AbstractController::Base может вернуть false. Например, контроллер электронной почты не поддерживает пути, только полные URL-адреса.
Публичные методы экземпляра
# File actionpack/lib/abstract_controller/base.rb, line 133 def action_methods self.class.action_methods end
Делегирует классу ::action_methods
# File actionpack/lib/abstract_controller/base.rb, line 147 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 128 def controller_path self.class.controller_path end
Делегирует классу ::controller_path
# File actionpack/lib/abstract_controller/base.rb, line 154 def performed? response_body end
Проверяет, установлен ли тело ответа. Используется для определения, нужно ли завершать обратный вызов process_action в AbstractController::Callbacks.
# File actionpack/lib/abstract_controller/base.rb, line 115
def process(action, *args)
@_action_name = action.to_s
unless action_name = _find_action_name(@_action_name)
raise ActionNotFound, "The action '#{action}' could not be found for #{self.class.name}"
end
@_response_body = nil
process_action(action_name, *args)
end Вызывает действие, пройдя через весь стек обработки действий.
Фактический вызываемый метод определяется с помощью вызова method_for_action. Если ни один метод не может обработать действие, генерируется ошибка AbstractController::ActionNotFound.
Возвращает
-
self
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.