Spec-Zone.ru › Ruby on Rails 6.1

модуль AbstractController::Helpers::ClassMethods

Атрибуты

_helpers[W]

Публичные методы экземпляров

_helpers_for_modification() Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 183
def _helpers_for_modification
  unless @_helpers
    self._helpers = define_helpers_module(self, superclass._helpers)
  end
  _helpers
end
clear_helpers() Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 157
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

Очищает все существующие помощники в этом классе, оставляя только помощника с таким же именем, что и этот класс.

helper(*args, &block) Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 146
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
helper_method(*methods) Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 78
      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|
          _helpers_for_modification.class_eval <<-ruby_eval, file, line
            def #{method}(*args, &block)                    # def current_user(*args, &block)
              controller.send(:'#{method}', *args, &block)  #   controller.send(:'current_user', *args, &block)
            end                                             # end
            ruby2_keywords(:'#{method}') if respond_to?(:ruby2_keywords, true)
          ruby_eval
        end
      end

Объявляет метод контроллера как помощника. Например, следующее делает методы контроллера current_user и logged_in? доступными для представления:

class ApplicationController < ActionController::Base
  helper_method :current_user, :logged_in?

  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] - имя или имена метода контроллера, которые должны быть доступны в представлении.

inherited(klass) Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 47
def inherited(klass)
  # Inherited from parent by default
  klass._helpers = nil

  klass.class_eval { default_helper_module! } unless klass.anonymous?
  super
end

При наследовании класса оберните его модуль помощника в новый модуль. Это гарантирует, что модуль родительского класса может быть изменен независимо от модуля дочернего класса.

Вызывает метод суперкласса
modules_for_helpers(modules_or_helper_prefixes) Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 168
def modules_for_helpers(modules_or_helper_prefixes)
  modules_or_helper_prefixes.flatten.map! do |module_or_helper_prefix|
    case module_or_helper_prefix
    when Module
      module_or_helper_prefix
    when String, Symbol
      helper_prefix = module_or_helper_prefix.to_s
      helper_prefix = helper_prefix.camelize unless helper_prefix.start_with?(/[A-Z]/)
      "#{helper_prefix}Helper".constantize
    else
      raise ArgumentError, "helper must be a String, Symbol, or Module"
    end
  end
end

Принимая массив значений, аналогичных тем, которые принимаются helper, этот метод возвращает массив соответствующих модулей в том же порядке.

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

Spec-Zone.ru

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