Rails チュートリアル 1章 勉強メモ4

Rails チュートリアルの勉強メモ

railstutorial.jp

  • 前回の続き見ていきます
    • 今日は別環境でやってたので思考垂れ流し編

1章続き rails new 何やってんの?

  • "rails/cli"
  • $HOME/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/railties-5.1.6/lib/rails/cli.rb
require "rails/app_loader"
  
# If we are inside a Rails application this method performs an exec and thus
# the rest of this script is not run.
Rails::AppLoader.exec_app

require "rails/ruby_version_check"
Signal.trap("INT") { puts; exit(1) }

require "rails/command"

if ARGV.first == "plugin"
  ARGV.shift
  Rails::Command.invoke :plugin, ARGV
else
  Rails::Command.invoke :application, ARGV
end
  • require "rails/command" から

    • command にはコマンドに関するメソッドが書いてそうだった
    • 実際に使うタイミングで追います
  • ARGV["new", "hello_app"] が入っている

  • ARGV.first"plugin" なら Rails::Command.invoke :plugin, ARGV -- plugin 付いているとき次の引数を plugin として読み出す?

  • そうでなければRails::Command.invoke :application, ARGV -- これは ARGVapplication として読み込むって感じだと思う

  • 今回、ARGV.firstnew なので

    • Rails::Command.invoke :application, ARGV
  • Rails::Command.invoke を読む

    30: def invoke(full_namespace, args = [], **config)
 => 31:   namespace = full_namespace = full_namespace.to_s
    32:
    33:   if char = namespace =~ /:(\w+)$/
    34:     command_name, namespace = $1, namespace.slice(0, char)
    35:   else
    36:     command_name = namespace
    37:   end
    38:
    39:   command_name, namespace = "help", "help" if command_name.blank? || HELP_MAPPINGS.include?(command_name)
    40:   command_name, namespace = "version", "version" if %w( -v --version ).include?(command_name)
    41:
    42:   command = find_by_namespace(namespace, command_name)
    43:   if command && command.all_commands[command_name]
    44:     command.perform(command_name, args, config)
    45:   else
    46:     find_by_namespace("rake").perform(full_namespace, args, config)
    47:   end
    48: end
  • full_namespace = :application
  • args = ["new", "hello"]
  • config = {}

  • if char = namespace =~ /:(\w+)$/

    • たぶん db:migrate みたいなものかな?
  • command_name, namespace = "help", "help" if command_name.blank? || HELP_MAPPINGS.include?(command_name)

    • command_name が空だと help が入る(普通に -h--help でも help
  • command = find_by_namespace(namespace, command_name)

    • find_by_namespace を読む
    63: def find_by_namespace(namespace, command_name = nil) # :nodoc:
 => 64:   lookups = [ namespace ]
    65:   lookups << "#{namespace}:#{command_name}" if command_name
    66:   lookups.concat lookups.map { |lookup| "rails:#{lookup}" }
    67:
    68:   lookup(lookups)
    69:
    70:   namespaces = subclasses.index_by(&:namespace)
    71:   namespaces[(lookups & namespaces.keys).first]
    72: end
  • lookups << "#{namespace}:#{command_name}" if command_name
    • もし command_name があれば lookups#{namespace}:#{command_name} の形で加える
      • 今回はこうなる ["application", "application:application"]
  • lookups.concat lookups.map { |lookup| "rails:#{lookup}" }

    • lookup 毎に "rails:#{lookup}" を入れる
      • ["application", "application:application", "rails:application", "rails:application:application"]
  • lookup を読む

    • rails/command/behavior.rb
    74: def lookup(namespaces)
 => 75:   paths = namespaces_to_paths(namespaces)
    76:
    77:   paths.each do |raw_path|
    78:     lookup_paths.each do |base|
    79:       path = "#{base}/#{raw_path}_#{command_type}"
    80:
    81:       begin
    82:         require path
    83:         return
    84:       rescue LoadError => e
    85:         raise unless e.message =~ /#{Regexp.escape(path)}$/
    86:       rescue Exception => e
    87:         warn "[WARNING] Could not load #{command_type} #{path.inspect}. Error: #{e.message}.\n#{e.backtrace.join("\n")}"
    88:       end
    89:     end
    90:   end
    91: end
  • paths = namespaces_to_paths(namespaces)
  • :/ に変換される
  • ex: ["rails/application/application/application"]
  • lookup_paths["rails/commands", "commands"]
  • path = "#{base}/#{raw_path}_#{command_type}"
    • "rails/commands/application/application_command"
  • require path して return

  • find_by_namespace に返ってきた

  • namespaces = subclasses.index_by(&:namespace)

    • namespaces{"rails:application"=>Rails::Command::ApplicationCommand}
  • namespaces[(lookups & namespaces.keys).first]

    • (lookups & namespaces.keys) = ["rails:application"]
  • Rails::Command.invokecommand には Rails::Command::ApplicationCommand が入る

  • 眠くなってきたので続きは次回