跳至内容 跳至搜索
命名空间
方法
A
C
F
H
I
L
P
S

常量

DEFAULT_ALIASES = { rails: { actions: "-a", orm: "-o", javascripts: ["-j", "--js"], resource_controller: "-c", scaffold_controller: "-c", stylesheets: "-y", template_engine: "-e", test_framework: "-t" }, test_unit: { fixture_replacement: "-r", } }
 
DEFAULT_OPTIONS = { rails: { api: false, assets: true, force_plural: false, helper: true, integration_tool: nil, orm: false, resource_controller: :controller, resource_route: true, scaffold_controller: :scaffold_controller, system_tests: nil, test_framework: nil, template_engine: :erb } }
 
RAILS_DEV_PATH = File.expand_path("../../../../../..", __dir__)
 

我们需要将 RAILS_DEV_PATH 存储在常量中,否则在 Ruby 1.8.7 中当我们 FileUtils.cd 时,路径可能会发生更改。

类公共方法

api_only!()

仅为 API 应用程序配置生成器。它基本上隐藏了所有通常与浏览器相关的内容,例如资产和会话迁移生成器,并完全禁用帮助程序和资产,以便诸如脚手架之类的生成器不会创建它们。

# File railties/lib/rails/generators.rb, line 112
def api_only!
  hide_namespaces "assets", "helper", "css", "js"

  options[:rails].merge!(
    api: true,
    assets: false,
    helper: false,
    template_engine: nil
  )

  options[:mailer] ||= {}
  options[:mailer][:template_engine] ||= :erb
end

fallbacks()

保留配置的生成器回退。如果插件开发者希望生成器组在缺少生成器的情况下回退到另一个组,他们可以添加回退。

例如,shoulda 被认为是 test_framework,是 test_unit 的扩展。然而,shoulda 生成器的大部分与 test_unit 生成器类似。

然后,Shoulda 可以通过添加回退来告诉生成器在某些生成器不可用时搜索 test_unit 生成器

Rails::Generators.fallbacks[:shoulda] = :test_unit
# File railties/lib/rails/generators.rb, line 104
def fallbacks
  @fallbacks ||= {}
end

help(command = "generate")

显示带有可用生成器的帮助消息。

# File railties/lib/rails/generators.rb, line 165
def help(command = "generate")
  puts "Usage:"
  puts "  bin/rails #{command} GENERATOR [args] [options]"
  puts
  puts "General options:"
  puts "  -h, [--help]     # Print generator's options and usage"
  puts "  -p, [--pretend]  # Run but do not make any changes"
  puts "  -f, [--force]    # Overwrite files that already exist"
  puts "  -s, [--skip]     # Skip files that already exist"
  puts "  -q, [--quiet]    # Suppress status output"
  puts
  puts "Please choose a generator below."
  puts

  print_generators
end

hidden_namespaces()

返回一个隐藏的生成器命名空间数组。生成器命名空间可能由于各种原因而被隐藏。有些是别名,例如“rails:migration”,可以用较短的“migration”来调用。

# File railties/lib/rails/generators.rb, line 130
def hidden_namespaces
  @hidden_namespaces ||= begin
    orm      = options[:rails][:orm]
    test     = options[:rails][:test_framework]
    template = options[:rails][:template_engine]

    [
      "rails",
      "resource_route",
      "#{orm}:migration",
      "#{orm}:model",
      "#{test}:controller",
      "#{test}:helper",
      "#{test}:integration",
      "#{test}:system",
      "#{test}:mailer",
      "#{test}:model",
      "#{test}:scaffold",
      "#{test}:view",
      "#{test}:job",
      "#{template}:controller",
      "#{template}:scaffold",
      "#{template}:mailer",
      "action_text:install",
      "action_mailbox:install"
    ]
  end
end

hide_namespace(*namespaces)

别名:hide_namespaces

hide_namespaces(*namespaces)

别名:hide_namespace
# File railties/lib/rails/generators.rb, line 159
def hide_namespaces(*namespaces)
  hidden_namespaces.concat(namespaces)
end

invoke(namespace, args = ARGV, config = {})

接收命名空间、参数和调用生成器的行为。它用作 generate、destroy 和 update 命令的默认入口点。

# File railties/lib/rails/generators.rb, line 257
      def invoke(namespace, args = ARGV, config = {})
        names = namespace.to_s.split(":")
        if klass = find_by_namespace(names.pop, names.any? && names.join(":"))
          args << "--help" if args.empty? && klass.arguments.any?(&:required?)
          klass.start(args, config)
          run_after_generate_callback if config[:behavior] == :invoke
        else
          options = sorted_groups.flat_map(&:last)
          error = Command::CorrectableNameError.new("Could not find generator '#{namespace}'.", namespace, options)

          puts <<~MSG
            #{error.detailed_message}
            Run `bin/rails generate --help` for more options.
          MSG
        end
      end

print_generators()

# File railties/lib/rails/generators.rb, line 187
def print_generators
  sorted_groups.each { |b, n| print_list(b, n) }
end

public_namespaces()

# File railties/lib/rails/generators.rb, line 182
def public_namespaces
  lookup!
  subclasses.map(&:namespace)
end

sorted_groups()

# File railties/lib/rails/generators.rb, line 191
def sorted_groups
  namespaces = public_namespaces
  namespaces.sort!

  groups = Hash.new { |h, k| h[k] = [] }
  namespaces.each do |namespace|
    base = namespace.split(":").first
    groups[base] << namespace
  end

  rails = groups.delete("rails")
  rails.map! { |n| n.delete_prefix("rails:") }
  rails.delete("app")
  rails.delete("plugin")
  rails.delete("encrypted_secrets")
  rails.delete("encrypted_file")
  rails.delete("encryption_key_file")
  rails.delete("master_key")
  rails.delete("credentials")
  rails.delete("db:system:change")

  hidden_namespaces.each { |n| groups.delete(n.to_s) }

  [[ "rails", rails ]] + groups.sort.to_a
end

类私有方法

command_type()

# File railties/lib/rails/generators.rb, line 301
def command_type # :doc:
  @command_type ||= "generator"
end

file_lookup_paths()

# File railties/lib/rails/generators.rb, line 309
def file_lookup_paths # :doc:
  @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ]
end

lookup_paths()

# File railties/lib/rails/generators.rb, line 305
def lookup_paths # :doc:
  @lookup_paths ||= %w( rails/generators generators )
end

print_list(base, namespaces)

# File railties/lib/rails/generators.rb, line 280
def print_list(base, namespaces) # :doc:
  namespaces = namespaces.reject { |n| hidden_namespaces.include?(n) }
  super
end