Skip to main content
Rails の 自動読み込み
を支える技術
2013-09-07 広島Ruby勉強会 #034
13年9月7日土曜日
Rails の読み込み規約
•Hoge -> hoge.rb
•HogeMogu -> hoge_mogu.rb
•Hoge::Mogu -> hoge/mogu.rb
13年9月7日土曜日
名前の変換
•ActiveSupport::Inflector.underscore
•Core Extention
•String#underscore
13年9月7日土曜日
関連モジュール
•ActiveSupport::Dependencies
•ActiveSupport::Autoload
13年9月7日土曜日
ActiveSupport::Dependencies
13年9月7日土曜日
自動読み込み
•Rails 用のコードはクラス名から自動読
み込みできる
•RAILS_ROOT/app/models/...
•RAILS_ROOT/app/helpers/...
•...
13年9月7日土曜日
RAILS_ROOT/lib
など自動は読み込みできない
13年9月7日土曜日
Rails を使わない場合
require 'active_support/dependencies.rb'
ActiveSupport::Dependencies.autoload_paths << 'lib'
13年9月7日土曜日
lib から自動読み込みが
できるようになります
13年9月7日土曜日
ライブラリなどでは使わない
•自作ライブラリで規約に沿った読み込み
は ActiveSupport::Autoload を使う
•アプリケーションの記述をシンプルにす
るために使う?
13年9月7日土曜日
Rails での初期値
• RAILS_ROOT/app/assets
• RAILS_ROOT/app/controllers
• RAILS_ROOT/app/helpers
• RAILS_ROOT/app/mailers
• RAILS_ROOT/app/models
• RAILS_ROOT/app/controllers/concerns
• RAILS_ROOT/app/models/concerns
13年9月7日土曜日
仕組み
•ConstMissing に処理を追加
•autoload_paths の中にあるか確認
•あれば読み込み
•なければ ConstMissing 発生
13年9月7日土曜日
動作をみたいなら
•Logger を設定
•log_activity = true に設定
•Rails の場合は Logger は設定済み
13年9月7日土曜日
Logger を使う
require 'active_support/dependencies.rb'
require 'logger'
ActiveSupport::Dependencies.logger = Logger.new($stderr)
ActiveSupport::Dependencies.log_activity = true
13年9月7日土曜日
require するだけで使える
• 読み込み時に呼んでるメソッドがある
• ActiveSupport::Dependencies.hook!
• 止めたい場合は
• ActiveSupport::Dependencies.unhook!
13年9月7日土曜日
知ってると便利かも
13年9月7日土曜日
ActiveSupport::Dependencies
.warnings_on_first_load
•はじめて読み込みしたクラス
•ログに出力
•二度目は出力しない
13年9月7日土曜日
ActiveSupport::Dependencies
.history
•読み込みしたクラスが格納
•Set で格納
•順番はわからない
13年9月7日土曜日
ActiveSupport::Dependencies
.loaded
•読み込みしたクラスがわかる
•History との違い
•clear されることがある
•これも Set
13年9月7日土曜日
ActiveSupport::Dependencies
.mechanism
•読み込みする時 に
•load を使うか (デフォルト)
•require を使うか
•環境変数 NO_RELOAD を設定で
•require に
13年9月7日土曜日
ActiveSupport::Dependencies
.explicitly_unloadable_constants
•自動読み込みの対象にしない名前を登録
13年9月7日土曜日
ActiveSupport::Autoload
13年9月7日土曜日
ライブラリで規約を利用
•Rails のコードではよく使われている
•lib/active_support.rb
•lib/active_record.rb
13年9月7日土曜日
autoload を拡張
•Kernel.autoload(module, filename)
•Module.autoload(module, filename)
•引数が2つ必要
13年9月7日土曜日
autoload を拡張
• ActiveSupport::Autoload
• #autoload(const_name, path = @@at_path)
• 第2引数が オプションに
13年9月7日土曜日
autoloadについて
•あるクラスが必要になった時にはじめて
ファイルを読み込みする
•第1引数 あるクラスの名前
•第2引数 読み込みするファイル
13年9月7日土曜日
第2引数は
規約から推測可能
13年9月7日土曜日
Kernelのほうはそのまま
13年9月7日土曜日
Module のほうだけ拡張
13年9月7日土曜日
例
require 'active_support/dependencies/autoload'
module Hoge
extend ActiveSupport::Autoload
autoload :Mogu
end
Hoge::Mogu
# > LoadError: cannot load such file -- hoge/mogu
13年9月7日土曜日
eager_autoload と autoload!
13年9月7日土曜日
よくある光景
eager_autoload do
autoload :Hoge
autoload :Mogu
end
13年9月7日土曜日
auto_load!
•eager_autoload の中にかいておくと
auto_load! でまとめて読み込みできる
•利点がはっきりとわからないです
•知ってたら教えて
13年9月7日土曜日
ご清聴ありがとうございます
13年9月7日土曜日