module AbstractController::Helpers::ClassMethods
Атрибуты
Публичные методы экземпляра
# File actionpack/lib/abstract_controller/helpers.rb, line 218
def _helpers_for_modification
unless @_helpers
self._helpers = define_helpers_module(self, superclass._helpers)
end
_helpers
end # File actionpack/lib/abstract_controller/helpers.rb, line 93
Возвращает список имён хелперов в указанном пути.
ActionController::Base.all_helpers_from_path 'app/helpers' # => ["application", "chart", "rubygems"]
# File actionpack/lib/abstract_controller/helpers.rb, line 209
def clear_helpers
inherited_helper_methods = _helper_methods
self._helpers = Module.new
self._helper_methods = Array.new
inherited_helper_methods.each { |meth| helper_method meth }
default_helper_module! unless anonymous?
end Удаляет все существующие хелперы этого класса, оставляя только хелпер с именем, совпадающим с именем класса.
# File actionpack/lib/abstract_controller/helpers.rb, line 198
def helper(*args, &block)
modules_for_helpers(args).each do |mod|
next if _helpers.include?(mod)
_helpers_for_modification.include(mod)
end
_helpers_for_modification.module_eval(&block) if block_given?
end Подключает указанные модули к классу шаблонов.
Модули можно указать разными способами. Все следующие вызовы подключают FooHelper:
# Module, recommended. helper FooHelper # String/symbol without the "helper" suffix, camel or snake case. helper "Foo" helper :Foo helper "foo" helper :foo
В двух последних случаях предполагается, что "foo".camelize возвращает «Foo».
Если переданы строки или символы, метод находит соответствующий объект модуля с помощью String#constantize. Поэтому, если модуль ещё не загружен, он должен поддерживать автозагрузку, что обычно и происходит.
Поддерживаются пространства имён. Следующие вызовы подключают Foo::BarHelper:
# Module, recommended. helper Foo::BarHelper # String/symbol without the "helper" suffix, camel or snake case. helper "Foo::Bar" helper :"Foo::Bar" helper "foo/bar" helper :"foo/bar"
В двух последних случаях предполагается, что "foo/bar".camelize возвращает «Foo::Bar».
Метод также принимает блок. Если блок задан, он выполняется в контексте модуля хелперов контроллера. Этот простой вызов делает метод wadus доступным в шаблонах окружающего контроллера:
helper do
def wadus
"wadus"
end
end
Кроме того, все описанные выше способы можно комбинировать:
helper FooHelper, "woo", "bar/baz" do
def wadus
"wadus"
end
end
# File actionpack/lib/abstract_controller/helpers.rb, line 128
def helper_method(*methods)
methods.flatten!
self._helper_methods += methods
location = caller_locations(1, 1).first
file, line = location.path, location.lineno
methods.each do |method|
# def current_user(...)
# controller.send(:'current_user', ...)
# end
_helpers_for_modification.class_eval <<~ruby_eval.lines.map(&:strip).join(";"), file, line
def #{method}(...)
controller.send(:'#{method}', ...)
end
ruby_eval
end
end Объявляет метод контроллера хелпером. Например, следующий код делает методы контроллера current_user и logged_in? доступными в представлении:
class ApplicationController < ActionController::Base
helper_method :current_user, :logged_in?
private
def current_user
@current_user ||= User.find_by(id: session[:user])
end
def logged_in?
current_user != nil
end
end
В представлении:
<% if logged_in? -%>Welcome, <%= current_user.name %><% end -%>
Параметры
-
method[, method]— имя или имена методов контроллера, которые должны быть доступны в представлении.
# File actionpack/lib/abstract_controller/helpers.rb, line 68
def inherited(klass)
# Inherited from parent by default
klass._helpers = nil
klass.class_eval { default_helper_module! } unless klass.anonymous?
super
end При наследовании класса его модуль хелперов оборачивается в новый модуль. Это позволяет изменять модуль родительского класса независимо от модуля дочернего класса.
# File actionpack/lib/abstract_controller/helpers.rb, line 81
Для массива значений, подобных тем, которые принимает helper, этот метод возвращает массив соответствующих модулей в том же порядке.
ActionController::Base.modules_for_helpers(["application", "chart", "rubygems"]) # => [ApplicationHelper, ChartHelper, RubygemsHelper]
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.