Spec-Zone.ru › Ruby on Rails 5.1

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

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

clear_helpers() Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 118
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 108
def helper(*args, &block)
  modules_for_helpers(args).each do |mod|
    add_template_helper(mod)
  end

  _helpers.module_eval(&block) if block_given?
end

Метод класса helper может принять серию имён модулей помощников, блок или оба.

Параметры

  • *args - Модуль, Символ, Строка

  • block - Блок, определяющий методы помощников

Если аргумент является модулем, он будет включён непосредственно в шаблонный класс.

helper FooHelper # => includes FooHelper

Если аргумент является строкой или символом, метод добавит суффикс «_helper», загрузит файл и включит модуль в шаблонный класс. Второй вариант демонстрирует, как включать пользовательских помощников при работе с контроллерами с именованными пространствами или в других случаях, когда файл с определением помощника не находится в стандартных путях загрузки Rails:

helper :foo             # => requires 'foo_helper' and includes FooHelper
helper 'resources/foo'  # => requires 'resources/foo_helper' and includes Resources::FooHelper

Кроме того, метод класса helper может принимать и оценивать блок, делая определённые методы доступными для шаблона.

# One line
helper { def hello() "Hello, world!" end }

# Multi-line
helper do
  def foo(bar)
    "#{bar} is the very best"
  end
end

Наконец, все вышеперечисленные стили могут быть смешаны, и метод helper может быть вызван с комбинацией symbols, strings, modules и блоков.

helper(:three, BlindHelper) { def mice() 'mice' end }
helper_method(*meths) Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 61
      def helper_method(*meths)
        meths.flatten!
        self._helper_methods += meths

        meths.each do |meth|
          _helpers.class_eval "            def #{meth}(*args, &blk)                               # def current_user(*args, &blk)
              controller.send(%(#{meth}), *args, &blk)             #   controller.send(:current_user, *args, &blk)
            end                                                    # end
", __FILE__, __LINE__ + 1
        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 33
def inherited(klass)
  helpers = _helpers
  klass._helpers = Module.new { include helpers }
  klass.class_eval { default_helper_module! } unless klass.anonymous?
  super
end

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

Вызывает метод родительского класса
modules_for_helpers(args) Показать исходный код
# File actionpack/lib/abstract_controller/helpers.rb, line 144
def modules_for_helpers(args)
  args.flatten.map! do |arg|
    case arg
    when String, Symbol
      file_name = "#{arg.to_s.underscore}_helper"
      begin
        require_dependency(file_name)
      rescue LoadError => e
        raise AbstractController::Helpers::MissingHelperError.new(e, file_name)
      end

      mod_name = file_name.camelize
      begin
        mod_name.constantize
      rescue LoadError
        # dependencies.rb gives a similar error message but its wording is
        # not as clear because it mentions autoloading. To the user all it
        # matters is that a helper module couldn't be loaded, autoloading
        # is an internal mechanism that should not leak.
        raise NameError, "Couldn't find #{mod_name}, expected it to be defined in helpers/#{file_name}.rb"
      end
    when Module
      arg
    else
      raise ArgumentError, "helper must be a String, Symbol, or Module"
    end
  end
end

Возвращает список модулей, нормализованных из допустимых типов помощников со следующей функциональностью:

Строка или Символ

:FooBar или “FooBar” преобразуется в “foo_bar_helper”,

и “foo_bar_helper.rb” загружается с помощью require_dependency.

Модуль

Дальнейшей обработки не требуется

После загрузки соответствующих файлов возвращаются соответствующие модули.

Параметры

  • args - Массив помощников

Возвращает

  • Array - Нормализованный список модулей для предоставленного списка помощников.

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

Spec-Zone.ru

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