класс AbstractController::Base
AbstractController::Base — это API низкого уровня. Никто не должен использовать его напрямую, и подклассы (например, ActionController::Base) должны предоставлять собственный метод render, так как отображение означает разные вещи в зависимости от контекста.
Атрибуты
Публичные методы класса
Определить контроллер как абстрактный. Подробнее см. ::internal_methods.
# File actionpack/lib/abstract_controller/base.rb, line 33 def abstract! @abstract = true end
Список имён методов, которые должны рассматриваться как действия. Это включает все публичные методы экземпляра контроллера, за вычетом внутренних методов (см. internal_methods), а затем добавляются обратно любые внутренние методы, но всё ещё существующие в классе. Наконец, удаляются hidden_actions.
Возвращает
-
Set— набор всех методов, которые следует рассматривать как действия.
# File actionpack/lib/abstract_controller/base.rb, line 77
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 { |x| x.to_s } -
# And always exclude explicitly hidden actions
hidden_actions.to_a
# Clear out AS callback method pollution
Set.new(methods.reject { |method| method =~ /_one_time_conditions/ })
end
end Методы ::action_methods кэшируются, и иногда требуется обновить их. clear_action_methods! позволяет сделать это, чтобы в следующий раз, когда вы запустите ::action_methods, они будут пересчитаны.
# File actionpack/lib/abstract_controller/base.rb, line 96 def clear_action_methods! @action_methods = nil end
Возвращает полное имя контроллера, с нижним подчеркиванием, без окончание Controller. Например, MyApp::MyPostsController вернёт «my_app/my_posts» для controller_path.
Возвращает
-
String
# File actionpack/lib/abstract_controller/base.rb, line 106 def controller_path @controller_path ||= name.sub(/Controller$/, '').underscore unless anonymous? end
Список скрытых действий. По умолчанию пустой массив. Это может быть изменено другими модулями или подклассами для указания конкретных действий как скрытых.
Возвращает
-
Array— массив имён методов, которые не следует рассматривать как действия.
Список всех внутренних методов для контроллера. Ищет первый абстрактный суперкласс контроллера и получает список всех публичных методов экземпляра этого абстрактного класса. Публичные методы экземпляра контроллера обычно рассматриваются как методы действия, поэтому методы, объявленные в абстрактных классах, удаляются. (ActionController::Metal и ActionController::Base определены как абстрактные)
# File actionpack/lib/abstract_controller/base.rb, line 52 def internal_methods controller = self controller = controller.superclass until controller.abstract? controller.public_instance_methods(true) end
Обновление кэшированных ::action_methods при добавлении нового метода действия.
# File actionpack/lib/abstract_controller/base.rb, line 111 def method_added(name) super clear_action_methods! end
Публичные методы экземпляра
Делегирует классу' action_methods
# File actionpack/lib/abstract_controller/base.rb, line 145 def action_methods self.class.action_methods end
Возвращает true, если метод для действия доступен и может быть обработан, в противном случае false.
Обратите внимание, что action_methods.include?("foo") может возвращать false, а available_action?("foo") возвращает true, потому что этот метод учитывает действия, которые также доступны другими способами, например, неявные отображение.
Параметры
-
action_name— имя действия, которое будет проверено
Возвращает
-
TrueClass,FalseClass
# File actionpack/lib/abstract_controller/base.rb, line 162 def available_action?(action_name) _find_action_name(action_name).present? end
Делегирует классу' controller_path
# File actionpack/lib/abstract_controller/base.rb, line 140 def controller_path self.class.controller_path end
Вызывает действие, проходя через весь стек диспетчеризации действий.
Фактический метод, который вызывается, определяется с помощью вызова method_for_action. Если ни один метод не может обработать действие, возникает ошибка ActionNotFound.
Возвращает
-
self
# File actionpack/lib/abstract_controller/base.rb, line 127
def process(action, *args)
@_action_name = 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
© 2004–2016 David Heinemeier Hansson
Licensed under the MIT License.