Ruby on Rails/サーバ起動時の処理を読む
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#contents
*はじめに [#p9a961bc]
Ruby on Railsでは通常以下のようにアプリケーションを作成・...
+$ rails accountbook
+$ ruby script/generate model Outgo
+$ ruby script/generate controller accountbook
+app/controllers/accountbook_controller.rbに「scaffold :o...
+$ ruby script/server
これで、http://localhost:3000/accountbook/にアクセスする...
なお、今回対象としたバージョンは1.2.3です。
*<アプリケーションディレクトリ>/config/boot.rb [#if85eb6b]
ではサーバを起動するためのscript/serverを見てみましょう。...
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/server'
というわけでconfig/boot.rbに移ります。
まずRAILS_ROOTとしてアプリケーションのルートディレクトリ...
次に、デフォルトではvendor/railsはないのでRubyGems経由でr...
最後に以下の一行が実行されています。
Rails::Initializer.run(:set_load_path)
*Rails::Initializer($GEM_HOME/gems/rails/lib/initializer....
Ruby::Initializer.runメソッドを見てみましょう。
def self.run(command = :process, configuration = Configu...
yield configuration if block_given?
initializer = new configuration
initializer.send(command)
initializer
end
ブロックは付けていないので、ただset_load_pathメソッドが呼...
def set_load_path
load_paths = configuration.load_paths + configuration....
load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir...
$LOAD_PATH.uniq!
end
やっていることは直感的だと思うので、実際にどのように動く...
まず、configuration.load_pathsはRails::Configuration#defa...
*$GEM_HOME/gems/rails/lib/commands/server.rb [#ya70cdb4]
README通り、Mongrelやlighttpdが使えるか調べています。ちら...
Mongrelもlighttpdも入れていないのでcommands/servers/webri...
*$GEM_HOME/gems/rails/lib/commands/servers/webrick.rb [#d...
まずオプション解析が行われてますがそこは無視します。
アプリケーションディレクトリのconfig/environment.rbを読み...
Rails::Initializer#processメソッドによる初期化の中で興味...
**Rails::Initializer#initialize_database [#bb339a7d]
initialize_databaseメソッドです。
def initialize_database
return unless configuration.frameworks.include?(:activ...
ActiveRecord::Base.configurations = configuration.data...
ActiveRecord::Base.establish_connection
end
Rails::Configuration#database_configurationメソッドです。...
def database_configuration
YAML::load(ERB.new(IO.read(database_configuration_file...
end
***ActiveRecord::Base.establish_connection ($GEM_HOME/gem...
ActiveRecord::Base.establish_connectionメソッドです。引数...
+nilでRAILS_ENVが指定されているので、RAILS_ENV(Stringオ...
+configurations[spec.to_s]の戻り値としてデータベース接続...
+adapter_methodで指定されるメソッドが定義されているので、...
+設定をクラス変数に格納
adapter_methodで指定されるメソッドは$GEM_HOME/gems/active...
unless defined?(RAILS_CONNECTION_ADAPTERS)
RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlit...
end
RAILS_CONNECTION_ADAPTERS.each do |adapter|
require "active_record/connection_adapters/" + adapter...
end
名前はestablish_coonnectionですが、実際の接続はまだ行って...
**Rails::Initializer#initialize_routing [#j6fca8f1]
initialize_routingです。
def initialize_routing
return unless configuration.frameworks.include?(:actio...
ActionController::Routing.controller_paths = configura...
ActionController::Routing::Routes.reload
end
***ActionController::Routing::Routes.reload ($GEM_HOME/ge...
ActionController::Routing::RoutesはActionController::Rout...
def load!
Routing.use_controllers! nil # Clear the controller ca...
clear!
load_routes!
named_routes.install
end
初めの2行は前の設定を破棄しているようなので無視しましょう...
def load_routes!
if defined?(RAILS_ROOT) && defined?(::ActionController...
load File.join("#{RAILS_ROOT}/config/routes.rb")
else
add_route ":controller/:action/:id"
end
end
ifの条件式が成り立つのでアプリケーションディレクトリにあ...
drawメソッドです。こちらでもclear!やnamed_routes.install...
def draw
clear!
yield Mapper.new(self)
named_routes.install
end
***ActionController::Routing::RouteBuilder [#y0f718a2]
yieldによってconfig/routes.rbに書かれているブロックに戻っ...
map.connect ':controller/:action/:id'
Mapper#connectメソッドです。
def connect(path, options = {})
@set.add_route(path, options)
end
@setは先ほどから見ているActionController::Routing::Routes...
def add_route(path, options = {})
route = builder.build(path, options)
routes << route
route
end
builderメソッドはRouteBuilderオブジェクトを返します。Rout...
segments = segments_for_route_path(path)
defaults, requirements, conditions = divide_route_option...
requirements = assign_route_options(segments, defaults, ...
route = Route.new
route.segments = segments
route.requirements = requirements
route.conditions = conditions
if !route.significant_keys.include?(:action) && !route.r...
route.requirements[:action] = "index"
route.significant_keys << :action
end
segments_for_route_pathメソッドは渡された文字列を複数のセ...
-DividerSegment('/'), is_optional == true
-ControllerSegment(:controller), is_optional == false
-DividerSegment('/'), is_optional == true
-DynamicSegment(:action), is_optional == false
-DividerSegment('/'), is_optional == true
-DynamicSegment(:id), is_optional == false
-DividerSegment('/'), is_optional == true
buildメソッドに戻って、divide_route_optionsメソッドはopti...
次にassign_route_optionsメソッドが呼ばれていますがdefault...
assign_default_route_options(segments)
ensure_required_segments(segments)
assign_default_route_optionsメソッドでは、:actionおよび:i...
http://localhost:3000/accountbook/
とだけ指定した場合に一覧画面が表示されるということになる...
buildメソッドに戻るとRouteオブジェクトが構築され、route中...
***ActionController::Routing::RouteSet::NamedRouteCollect...
以上でルーティング情報が構築されたのでActionController::R...
def install(destinations = [ActionController::Base, Acti...
Array(destinations).each { |dest| dest.send :include, ...
end
ActionController::BaseとActionView::Baseにメソッドを追加...
*DispatchServlet($GEM_HOME/gems/rails/lib/webrick_server....
$GEM_HOME/rails/lib/commands/servers/webrick.rbはDispatch...
dispatchメソッドでは、WEBrick::HTTPServerオブジェクトを作...
server.mount('/', DispatchServlet, options)
とすることで全てのリクエストを自分で処理することになって...
*おわりに [#yf98cadf]
今回はRuby on Rallsのうち、サーバ起動時にどのような処理が...
-RubyGemsが使われているとクラスやメソッドが定義されている...
-activesupportが使われているともっと大変
といったところです:-)
それではみなさんもよいコードリーディングを。
終了行:
#contents
*はじめに [#p9a961bc]
Ruby on Railsでは通常以下のようにアプリケーションを作成・...
+$ rails accountbook
+$ ruby script/generate model Outgo
+$ ruby script/generate controller accountbook
+app/controllers/accountbook_controller.rbに「scaffold :o...
+$ ruby script/server
これで、http://localhost:3000/accountbook/にアクセスする...
なお、今回対象としたバージョンは1.2.3です。
*<アプリケーションディレクトリ>/config/boot.rb [#if85eb6b]
ではサーバを起動するためのscript/serverを見てみましょう。...
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../config/boot'
require 'commands/server'
というわけでconfig/boot.rbに移ります。
まずRAILS_ROOTとしてアプリケーションのルートディレクトリ...
次に、デフォルトではvendor/railsはないのでRubyGems経由でr...
最後に以下の一行が実行されています。
Rails::Initializer.run(:set_load_path)
*Rails::Initializer($GEM_HOME/gems/rails/lib/initializer....
Ruby::Initializer.runメソッドを見てみましょう。
def self.run(command = :process, configuration = Configu...
yield configuration if block_given?
initializer = new configuration
initializer.send(command)
initializer
end
ブロックは付けていないので、ただset_load_pathメソッドが呼...
def set_load_path
load_paths = configuration.load_paths + configuration....
load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir...
$LOAD_PATH.uniq!
end
やっていることは直感的だと思うので、実際にどのように動く...
まず、configuration.load_pathsはRails::Configuration#defa...
*$GEM_HOME/gems/rails/lib/commands/server.rb [#ya70cdb4]
README通り、Mongrelやlighttpdが使えるか調べています。ちら...
Mongrelもlighttpdも入れていないのでcommands/servers/webri...
*$GEM_HOME/gems/rails/lib/commands/servers/webrick.rb [#d...
まずオプション解析が行われてますがそこは無視します。
アプリケーションディレクトリのconfig/environment.rbを読み...
Rails::Initializer#processメソッドによる初期化の中で興味...
**Rails::Initializer#initialize_database [#bb339a7d]
initialize_databaseメソッドです。
def initialize_database
return unless configuration.frameworks.include?(:activ...
ActiveRecord::Base.configurations = configuration.data...
ActiveRecord::Base.establish_connection
end
Rails::Configuration#database_configurationメソッドです。...
def database_configuration
YAML::load(ERB.new(IO.read(database_configuration_file...
end
***ActiveRecord::Base.establish_connection ($GEM_HOME/gem...
ActiveRecord::Base.establish_connectionメソッドです。引数...
+nilでRAILS_ENVが指定されているので、RAILS_ENV(Stringオ...
+configurations[spec.to_s]の戻り値としてデータベース接続...
+adapter_methodで指定されるメソッドが定義されているので、...
+設定をクラス変数に格納
adapter_methodで指定されるメソッドは$GEM_HOME/gems/active...
unless defined?(RAILS_CONNECTION_ADAPTERS)
RAILS_CONNECTION_ADAPTERS = %w( mysql postgresql sqlit...
end
RAILS_CONNECTION_ADAPTERS.each do |adapter|
require "active_record/connection_adapters/" + adapter...
end
名前はestablish_coonnectionですが、実際の接続はまだ行って...
**Rails::Initializer#initialize_routing [#j6fca8f1]
initialize_routingです。
def initialize_routing
return unless configuration.frameworks.include?(:actio...
ActionController::Routing.controller_paths = configura...
ActionController::Routing::Routes.reload
end
***ActionController::Routing::Routes.reload ($GEM_HOME/ge...
ActionController::Routing::RoutesはActionController::Rout...
def load!
Routing.use_controllers! nil # Clear the controller ca...
clear!
load_routes!
named_routes.install
end
初めの2行は前の設定を破棄しているようなので無視しましょう...
def load_routes!
if defined?(RAILS_ROOT) && defined?(::ActionController...
load File.join("#{RAILS_ROOT}/config/routes.rb")
else
add_route ":controller/:action/:id"
end
end
ifの条件式が成り立つのでアプリケーションディレクトリにあ...
drawメソッドです。こちらでもclear!やnamed_routes.install...
def draw
clear!
yield Mapper.new(self)
named_routes.install
end
***ActionController::Routing::RouteBuilder [#y0f718a2]
yieldによってconfig/routes.rbに書かれているブロックに戻っ...
map.connect ':controller/:action/:id'
Mapper#connectメソッドです。
def connect(path, options = {})
@set.add_route(path, options)
end
@setは先ほどから見ているActionController::Routing::Routes...
def add_route(path, options = {})
route = builder.build(path, options)
routes << route
route
end
builderメソッドはRouteBuilderオブジェクトを返します。Rout...
segments = segments_for_route_path(path)
defaults, requirements, conditions = divide_route_option...
requirements = assign_route_options(segments, defaults, ...
route = Route.new
route.segments = segments
route.requirements = requirements
route.conditions = conditions
if !route.significant_keys.include?(:action) && !route.r...
route.requirements[:action] = "index"
route.significant_keys << :action
end
segments_for_route_pathメソッドは渡された文字列を複数のセ...
-DividerSegment('/'), is_optional == true
-ControllerSegment(:controller), is_optional == false
-DividerSegment('/'), is_optional == true
-DynamicSegment(:action), is_optional == false
-DividerSegment('/'), is_optional == true
-DynamicSegment(:id), is_optional == false
-DividerSegment('/'), is_optional == true
buildメソッドに戻って、divide_route_optionsメソッドはopti...
次にassign_route_optionsメソッドが呼ばれていますがdefault...
assign_default_route_options(segments)
ensure_required_segments(segments)
assign_default_route_optionsメソッドでは、:actionおよび:i...
http://localhost:3000/accountbook/
とだけ指定した場合に一覧画面が表示されるということになる...
buildメソッドに戻るとRouteオブジェクトが構築され、route中...
***ActionController::Routing::RouteSet::NamedRouteCollect...
以上でルーティング情報が構築されたのでActionController::R...
def install(destinations = [ActionController::Base, Acti...
Array(destinations).each { |dest| dest.send :include, ...
end
ActionController::BaseとActionView::Baseにメソッドを追加...
*DispatchServlet($GEM_HOME/gems/rails/lib/webrick_server....
$GEM_HOME/rails/lib/commands/servers/webrick.rbはDispatch...
dispatchメソッドでは、WEBrick::HTTPServerオブジェクトを作...
server.mount('/', DispatchServlet, options)
とすることで全てのリクエストを自分で処理することになって...
*おわりに [#yf98cadf]
今回はRuby on Rallsのうち、サーバ起動時にどのような処理が...
-RubyGemsが使われているとクラスやメソッドが定義されている...
-activesupportが使われているともっと大変
といったところです:-)
それではみなさんもよいコードリーディングを。
ページ名: