Spec-Zone.ru › Ruby on Rails 4.2

класс Rails::Generators::Base

Родитель:
Thor::Group
Включенные модули:
Rails::Generators::Actions

Общедоступные методы класса

base_root() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 217
def self.base_root
  File.dirname(__FILE__)
end

Возвращает базовый корень для общего набора генераторов. Используется для динамического определения корня исходного кода по умолчанию.

default_source_root() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 208
def self.default_source_root
  return unless base_name && generator_name
  return unless default_generator_root
  path = File.join(default_generator_root, 'templates')
  path if File.exist?(path)
end

Возвращает корень исходного кода по умолчанию для данного генератора. Внутренне используется Rails для установки корня исходного кода генераторов. Если вы хотите настроить свой корень, используйте source_root.

desc(description=nil) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 30
def self.desc(description=nil)
  return super if description

  @desc ||= if usage_path
    ERB.new(File.read(usage_path)).result(binding)
  else
    "Description:\n    Create #{base_name.humanize.downcase} files for #{generator_name} generator."
  end
end

Пытается получить описание из файла USAGE в папке выше корня исходного кода, иначе использует описание по умолчанию.

Вызывает метод родительского класса
hide!() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 50
def self.hide!
  Rails::Generators.hide_namespace self.namespace
end

Удобный метод для скрытия этого генератора из доступных при запуске команды rails generate.

hook_for(*names, &block) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 163
def self.hook_for(*names, &block)
  options = names.extract_options!
  in_base = options.delete(:in) || base_name
  as_hook = options.delete(:as) || generator_name

  names.each do |name|
    unless class_options.key?(name)
      defaults = if options[:type] == :boolean
        { }
      elsif [true, false].include?(default_value_for_option(name, options))
        { banner: "" }
      else
        { desc: "#{name.to_s.humanize} to be invoked", banner: "NAME" }
      end

      class_option(name, defaults.merge!(options))
    end

    hooks[name] = [ in_base, as_hook ]
    invoke_from_option(name, options, &block)
  end
end

Вызывает генератор на основе значения, предоставленного пользователем для указанного параметра с именем «name». Классовый параметр создается при вызове этого метода, и вы можете установить хеш для его настройки.

Примеры

module Rails::Generators
  class ControllerGenerator < Base
    hook_for :test_framework, aliases: "-t"
  end
end

В приведенном выше примере будет создан параметр тестовой среды, и будет вызван генератор на основе предоставленного пользователем значения.

Например, если пользователь вызовет генератор контроллера как:

rails generate controller Account --test-framework=test_unit

Генератор контроллера затем попытается вызвать следующие генераторы:

"rails:test_unit", "test_unit:controller", "test_unit"

Обратите внимание, что «rails:generators:test_unit» также может быть загружен, то, что Rails ищет, это первые и последние части пространства имен. Это то, что позволяет любой тестовой среде подключаться к Rails, поскольку она предоставляет какие-либо из указанных выше хуков.

Параметры

Первая и последняя части, используемые для поиска вызываемого генератора, угадываются на основе вызовов класса ::hook_for, как видно из примера выше. Это можно настроить с помощью двух параметров: :in и :as.

Предположим, вы создаёте генератор, которому нужно вызвать генератор контроллера из test unit. Ваша первая попытка:

class AwesomeGenerator < Rails::Generators::Base
  hook_for :test_framework
end

Поиск в этом случае для test_unit в качестве входных данных:

"test_unit:awesome", "test_unit"

Что не является желаемым поиском. Вы можете изменить его, предоставив параметр :as:

class AwesomeGenerator < Rails::Generators::Base
  hook_for :test_framework, as: :controller
end

И теперь он будет искать в:

"test_unit:controller", "test_unit"

Аналогично, если вы хотите, чтобы он также искал в пространстве имён rails, вам просто нужно предоставить значение :in:

class AwesomeGenerator < Rails::Generators::Base
  hook_for :test_framework, in: :rails, as: :controller
end

И поиск будет точно таким же, как и прежде:

"rails:test_unit", "test_unit:controller", "test_unit"

Переключатели

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

rails generate controller Account --skip-test-framework

Или аналогично:

rails generate controller Account --no-test-framework

Булевы хуки

В некоторых случаях вы можете предоставить булев хук. Например, разработчики webrat могут захотеть, чтобы webrat был доступен в генераторе контроллера. Этого можно достичь следующим образом:

Rails::Generators::ControllerGenerator.hook_for :webrat, type: :boolean

Затем, если вы хотите вызвать webrat, просто укажите:

rails generate controller Account --webrat

Поиск хуков аналогичен вышеприведённому:

"rails:generators:webrat", "webrat:generators:controller", "webrat"

Настраиваемые вызовы

Вы также можете предоставить блок для ::hook_for, чтобы настроить, как будет вызван хук. Блок получает два аргумента: экземпляр текущего класса и вызываемый класс.

Например, в генераторе ресурсов контроллер должен вызываться с множественным именем класса. Но по умолчанию он вызывается с тем же именем, что и генератор ресурсов, то есть единственным. Чтобы изменить это, мы можем предоставить блок для настройки вызова контроллера.

hook_for :resource_controller do |instance, controller|
  instance.invoke controller, [ instance.name.pluralize ]
end
namespace(name=nil) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 43
def self.namespace(name=nil)
  return super if name
  @namespace ||= super.sub(/_generator$/, '').sub(/:generators:/, ':')
end

Удобный метод для получения пространства имен из имени класса. Он такой же, как у Thor по умолчанию, за исключением того, что генератор в конце класса удаляется.

Вызывает метод родительского класса
remove_hook_for(*names) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 189
def self.remove_hook_for(*names)
  remove_invocation(*names)

  names.each do |name|
    hooks.delete(name)
  end
end

Удаляет ранее добавленный хук.

remove_hook_for :orm
source_root(path=nil) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 23
def self.source_root(path=nil)
  @_source_root = path if path
  @_source_root ||= default_source_root
end

Возвращает корень исходного кода для этого генератора, используя ::default_source_root в качестве значения по умолчанию.

Защищённые методы класса

add_shebang_option!() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 346
def self.add_shebang_option!
  class_option :ruby, type: :string, aliases: "-r", default: Thor::Util.ruby_command,
                      desc: "Path to the Ruby binary of your choice", banner: "PATH"

  no_tasks {
    define_method :shebang do
      @shebang ||= begin
        command = if options[:ruby] == Thor::Util.ruby_command
          "/usr/bin/env #{File.basename(Thor::Util.ruby_command)}"
        else
          options[:ruby]
        end
        "#!#{command}"
      end
    end
  }
end

Небольшой макрос для добавления ruby в качестве параметра генератора с соответствующим значением по умолчанию, а также вспомогательного метода экземпляра shebang.

banner() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 275
def self.banner
  "rails generate #{namespace.sub(/^rails:/,'')} #{self.arguments.map{ |a| a.usage }.join(' ')} [options]".gsub(/\s+/, ' ')
end

Используйте стандартный баннер Rails.

base_name() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 280
def self.base_name
  @base_name ||= begin
    if base = name.to_s.split('::').first
      base.underscore
    end
  end
end

Устанавливает ::base_name, учитывая текущее пространство имен класса.

default_aliases_for_option(name, options) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 307
def self.default_aliases_for_option(name, options)
  default_for_option(Rails::Generators.aliases, name, options, options[:aliases])
end

Возвращает значения по умолчанию для имени параметра, выполняя поиск в Rails::Generators.aliases.

default_for_option(config, name, options, default) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 312
def self.default_for_option(config, name, options, default)
  if generator_name and c = config[generator_name.to_sym] and c.key?(name)
    c[name]
  elsif base_name and c = config[base_name.to_sym] and c.key?(name)
    c[name]
  elsif config[:rails].key?(name)
    config[:rails][name]
  else
    default
  end
end

Возвращает значение по умолчанию для имени параметра, выполняя поиск в config.

default_generator_root() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 372
def self.default_generator_root
  path = File.expand_path(File.join(base_name, generator_name), base_root)
  path if File.exist?(path)
end
default_value_for_option(name, options) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 301
def self.default_value_for_option(name, options)
  default_for_option(Rails::Generators.options, name, options, options[:default])
end

Возвращает значение по умолчанию для имени параметра, выполняя поиск в Rails::Generators.options.

generator_name() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 290
def self.generator_name
  @generator_name ||= begin
    if generator = name.to_s.split('::').last
      generator.sub!(/Generator$/, '')
      generator.underscore
    end
  end
end

Удаляет пространства имён и получает имя генератора. Например, Rails::Generators::ModelGenerator вернёт «model» как имя генератора.

usage_path() Показать исходный код
# File railties/lib/rails/generators/base.rb, line 364
def self.usage_path
  paths = [
    source_root && File.expand_path("../USAGE", source_root),
    default_generator_root && File.join(default_generator_root, "USAGE")
  ]
  paths.compact.detect { |path| File.exist? path }
end

Защищённые методы экземпляра

extract_last_module(nesting) Показать исходный код
# File railties/lib/rails/generators/base.rb, line 267
def extract_last_module(nesting)
  nesting.inject(Object) do |last_module, nest|
    break unless last_module.const_defined?(nest, false)
    last_module.const_get(nest)
  end
end

Принимает массив вложенных модулей и извлекает последний модуль

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

Spec-Zone.ru

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