123456789_123456789_123456789_123456789_123456789_

Module: Rails::Generators

Relationships & Source Files
Namespace Children
Modules:
Classes:
Defined in: activejob/lib/rails/generators/job/job_generator.rb,
actioncable/lib/rails/generators/channel/channel_generator.rb,
actionmailbox/lib/rails/generators/mailbox/mailbox_generator.rb,
actionmailer/lib/rails/generators/mailer/mailer_generator.rb,
railties/lib/rails/generators.rb,
railties/lib/rails/commands/application/application_command.rb,
railties/lib/rails/generators/actions.rb,
railties/lib/rails/generators/active_model.rb,
railties/lib/rails/generators/app_base.rb,
railties/lib/rails/generators/app_name.rb,
railties/lib/rails/generators/base.rb,
railties/lib/rails/generators/database.rb,
railties/lib/rails/generators/generated_attribute.rb,
railties/lib/rails/generators/migration.rb,
railties/lib/rails/generators/model_helpers.rb,
railties/lib/rails/generators/named_base.rb,
railties/lib/rails/generators/resource_helpers.rb,
railties/lib/rails/generators/test_case.rb,
railties/lib/rails/generators/actions/create_migration.rb,
railties/lib/rails/generators/rails/app/app_generator.rb,
railties/lib/rails/generators/rails/application_record/application_record_generator.rb,
railties/lib/rails/generators/rails/assets/assets_generator.rb,
railties/lib/rails/generators/rails/benchmark/benchmark_generator.rb,
railties/lib/rails/generators/rails/controller/controller_generator.rb,
railties/lib/rails/generators/rails/credentials/credentials_generator.rb,
railties/lib/rails/generators/rails/db/system/change/change_generator.rb,
railties/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb,
railties/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb,
railties/lib/rails/generators/rails/generator/generator_generator.rb,
railties/lib/rails/generators/rails/helper/helper_generator.rb,
railties/lib/rails/generators/rails/integration_test/integration_test_generator.rb,
railties/lib/rails/generators/rails/master_key/master_key_generator.rb,
railties/lib/rails/generators/rails/migration/migration_generator.rb,
railties/lib/rails/generators/rails/model/model_generator.rb,
railties/lib/rails/generators/rails/plugin/plugin_generator.rb,
railties/lib/rails/generators/rails/resource/resource_generator.rb,
railties/lib/rails/generators/rails/resource_route/resource_route_generator.rb,
railties/lib/rails/generators/rails/scaffold/scaffold_generator.rb,
railties/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb,
railties/lib/rails/generators/rails/system_test/system_test_generator.rb,
railties/lib/rails/generators/rails/task/task_generator.rb,
railties/lib/rails/generators/testing/assertions.rb,
railties/lib/rails/generators/testing/behaviour.rb,
railties/lib/rails/generators/testing/setup_and_teardown.rb

Constant Summary

  • DEFAULT_ALIASES =
    # File 'railties/lib/rails/generators.rb', line 32
    {
      rails: {
        actions: "-a",
        orm: "-o",
        javascripts: "-j",
        javascript_engine: "-je",
        resource_controller: "-c",
        scaffold_controller: "-c",
        stylesheets: "-y",
        stylesheet_engine: "-se",
        scaffold_stylesheet: "-ss",
        template_engine: "-e",
        test_framework: "-t"
      },
    
      test_unit: {
        fixture_replacement: "-r",
      }
    }
  • DEFAULT_OPTIONS =
    # File 'railties/lib/rails/generators.rb', line 52
    {
      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,
        stylesheets: true,
        stylesheet_engine: :css,
        scaffold_stylesheet: true,
        system_tests: nil,
        test_framework: nil,
        template_engine: :erb
      }
    }
  • RAILS_DEV_PATH =

    We need to store the RAILS_DEV_PATH in a constant, otherwise the path can change in Ruby 1.8.7 when we FileUtils.cd.

    # File 'railties/lib/rails/generators/rails/app/app_generator.rb', line 261
    File.expand_path("../../../../../..", __dir__)

Class Attribute Summary

Class Method Summary

Instance Attribute Summary

Class Attribute Details

.namespace (rw) Also known as: #namespace

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 30

mattr_accessor :namespace

Class Method Details

.api_only!

Configure generators for API only applications. It basically hides everything that is usually browser related, such as assets and session migration generators, and completely disable helpers and assets so generators such as scaffold won’t create them.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 121

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

.command_type (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 316

def command_type # :doc:
  @command_type ||= "generator"
end

.fallbacks

Hold configured generators fallbacks. If a plugin developer wants a generator group to fallback to another group in case of missing generators, they can add a fallback.

For example, shoulda is considered a test_framework and is an extension of test_unit. However, most part of shoulda generators are similar to test_unit ones.

Shoulda then can tell generators to search for test_unit generators when some of them are not available by adding a fallback:

Rails::Generators.fallbacks[:shoulda] = :test_unit
[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 113

def fallbacks
  @fallbacks ||= {}
end

.file_lookup_paths (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 324

def file_lookup_paths # :doc:
  @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_generator.rb" ]
end

.help(command = "generate")

Show help message with available generators.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 180

def help(command = "generate")
  puts "Usage: 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

Returns an array of generator namespaces that are hidden. Generator namespaces may be hidden for a variety of reasons. Some are aliased such as “rails:migration” and can be invoked with the shorter “migration”, others are private to other generators such as “css:scaffold”.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 140

def hidden_namespaces
  @hidden_namespaces ||= begin
    orm      = options[:rails][:orm]
    test     = options[:rails][:test_framework]
    template = options[:rails][:template_engine]
    css      = options[:rails][:stylesheet_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",
      "#{css}:scaffold",
      "#{css}:assets",
      "css:assets",
      "css:scaffold",
      "action_text:install",
      "action_mailbox:install"
    ]
  end
end

.hide_namespace(*namespaces)

Alias for .hide_namespaces.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 177

alias hide_namespace hide_namespaces

.hide_namespaces(*namespaces) Also known as: .hide_namespace

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 174

def hide_namespaces(*namespaces)
  hidden_namespaces.concat(namespaces)
end

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

Receives a namespace, arguments and the behavior to invoke the generator. It’s used as the default entry point for generate, destroy and update commands.

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 271

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)
    suggestion  = Rails::Command::Spellchecker.suggest(namespace.to_s, from: options)
    suggestion_msg = "Maybe you meant #{suggestion.inspect}?" if suggestion

    puts <<~MSG
      Could not find generator '#{namespace}'. #{suggestion_msg}
      Run `bin/rails generate --help` for more options.
    MSG
  end
end

.lookup_paths (private)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 320

def lookup_paths # :doc:
  @lookup_paths ||= %w( rails/generators generators )
end

.public_namespaces

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 196

def public_namespaces
  lookup!
  subclasses.map(&:namespace)
end

.sorted_groups

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 205

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

Instance Attribute Details

#namespace (rw)

[ GitHub ]

  
# File 'railties/lib/rails/generators.rb', line 30

mattr_accessor :namespace