Rails チュートリアル 1章 勉強メモ4
Rails チュートリアルの勉強メモ
- 前回の続き見ていきます
- 今日は別環境でやってたので思考垂れ流し編
1章続き rails new 何やってんの?
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
-- これはARGV
をapplication
として読み込むって感じだと思う今回、
ARGV.first
はnew
なので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
して returnfind_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.invoke
のcommand
にはRails::Command::ApplicationCommand
が入る眠くなってきたので続きは次回