Если вы изучаете Rails, это не место для этого. Возможно, у вас есть мысль, что для того, чтобы использовать его, вам нужно понять, как код течет с самого начала? Не делай этого. :)
Если вы изучаете рельсы, используйте любое из множества руководств и учебных пособий для создания базового сайта.
Что касается этого фрагмента кода, некоторые концепции, которые он использует, включают в себя знаковые символы ruby class << self
Вот критическое прочтение мета-классов: http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.....
module Rails
class << self
def boot!
unless booted?
preinitialize
pick_boot.run
end
end
...
Здесь вы можете увидеть магию, лежащую в основе class << self
... он создал метод boot!
на самом модуле. оттуда вы можете отследить вызов метода по всему файлу, так как он проверяет наличие файла преинициализатора ...
pick_boot
возвращает объект, либо VendorBoot
, либо GemBoot
в зависимости от результата vendor_rails?
, а затем вызывает для него метод run
.
Оттуда у вас есть стандартное наследование классов Boot
, так как оно устанавливает остальные библиотеки. Надеюсь, это поможет вам начать. :)
На самом деле это очень хороший стиль ОО ... небольшие методы и классы, которые все выполняют простую задачу. Есть также наследственное наследие и несколько общих рубиновых идиом. В общем, очень хороший код ruby. :)
Обновление
Вот приблизительная оценка того, как это выглядело бы, если бы кодировался в более процедурном стиле:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
unless defined? Rails::Initializer
preinitializer_path = "#{RAILS_ROOT}/config/preinitializer.rb"
load() if File.exist?(preinitializer_path)
if File.exist?("#{RAILS_ROOT}/vendor/rails")
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
Rails::Initializer.run(:install_gem_spec_stubs)
Rails::Initializer.run(:set_load_path)
else
begin
require 'rubygems'
min_version = '1.1.1'
rubygems_version = Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
unless rubygems_version >= min_version
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
exit 1
end
rescue LoadError
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
exit 1
end
begin
if defined? RAILS_GEM_VERSION
version = RAILS_GEM_VERSION
elsif ENV.include?('RAILS_GEM_VERSION')
version = ENV['RAILS_GEM_VERSION']
else
version = $1 if (File.read("#{RAILS_ROOT}/config/environment.rb")) =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~=]*\s*[\d.]+)["']/
end
if version
gem 'rails', version
else
gem 'rails'
end
rescue Gem::LoadError => load_error
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
exit 1
end
require 'initializer'
end
end