今さらRails3メモ - その3: デバッグというか差し込み口と中身の確認 -
どこで何が確認できるか分かってないと結構つらいので。
差し込み口
- C の action 前後の filter ( before_filter, after_filter, around_filter )
- M の validation および create/save/destroy 前後の callback ( create, update, destroy は around もある )
- さらに M の after_initialize, after_find などにも
ここに処理を挟み込むことで C や M のロジックを複雑にしないでデバッグのためにアレコレ仕込んで確認することができる。
cf.
- Ruby on Rails Guides: Action Controller Overview
- Module: ActiveRecord::Callbacks
- Ruby on Rails Guides: Active Record Validations and Callbacks
Controller
- verify
- filter ( before, after, around )
- after は action の実行後、つまり全体では
before_filter
def action; end
after_filter
となっており、before_filter が走る段階で routing などは終わっている。
vefiry は文字通り vefiry しかできないので、処理を挟む余地はない。ただし model の validate をまたずに弾き返すことができるのでたぶん速い。(特殊な before_filter らしい。)
around_filter は before と after および実際のアクションの間に実行される。
- before_filter
- around_filter1
- around_filter2
- def action; end
- around_filter2
- around_filter1
- after_filter
の状態になる。
Model
結構たくさんある。順番に
- before_validation
- before_validation_on_#{CRUD}
validate
- after_validation
- after_validation_on_#{CRUD}
- before_save
- before_create
create ( だけじゃない )
- after_create
- after_save
action が走らないと Model Object は生成されないので、validate の実行タイミングは action の後というか action の中。
確認方法
- rails console で主に model の method の確認
- rails server を立ち上げた terminal で次々に起こることを目視する
- p でそこに情報を吐き出す。(これはログには落ちない)
- とても伝統的。rails server を実行している console に表示される。
- V なら debug を使う
- logger の設定を default から変更して logger インスタンスを起こす。この logger に必要な情報を吐き出す。
- debugger を起動する
1 の rails console はすごく好きなんだけど web server が動いているわけではないので request を扱うことはできない。form の作り方間違えて validation のタイミングでちゃんと値が渡ってきてないんじゃないかしらと思ったら
class Controller
before_filter do
debugger
end
end
とか
class Model
before_validation do
debugger
end
end
しておくと自由に確認できる。単に目視できればいいだけなら p でもいいけど、development のログは結構詳細に出るので簡単に流れていってしまう。多少面倒でも logger か debugger を使うとよい感じ。
4 の debug は Typus の中だとあまり機能しないような気がするので、V ならいつでも debug できるとは思わない方がいいみたい。
5 の logger の設定は思っていたより面倒だった。
6 の debugger は強力なんだけど、いちいち break してしまうのが面倒とも言える。
continue
すれば復帰できるとは言え。
logger の設定と使い方
こんな感じ。
config.logger = Logger.new( File.join( Rails.root,
'log',
"#{Rails.env}.log" ) )
config.log_level = Logger::DEBUG
を config/environments/development.rb に追加した。使う時は
logger.debug( object.to_s )
みたいな感じで。
log_level を上げればいいだけかと思ってたんだけど、なんかどうもできないっぽい。
debugger の設定と使い方
Gemfile に ruby-debug(19)? を追加
group :development do
gem 'ruby-debug' if RUBY_VERSION < '1.9'
gem 'ruby-debug19' if RUBY_VERSION >= '1.9'
end
で、
- rails server -u ( –debugger ) でサーバを起動
- 好きな場所に debugger と書いて止める
cf.
Ruby on Rails Guides: Debugging Rails Applications
request parameters を確認する
request parameter は rails console では確認できないので、今回紹介した console 以外の方法が生きる。
- request parameter を確認するなら C の before_filter で params を見る1
- request 全体は request メソッド
- params は request.parameters, request.headers.parameters の alias
- jpmobile 環境では request.parameters が変更されていて、オリジナルは request.parameters_without_jpmobile
- request.parameters は Http::Parameters オブジェクト
- ヘッダは request.headers
※ 脱線だが request に適用できる filter は request.methods.filter に出てくる parameter_filter, env_filter, parameter_filter_for 辺りか?
こうすると無駄な処理が動かない ↩