今さらRails3メモ - その3: デバッグというか差し込み口と中身の確認 -

どこで何が確認できるか分かってないと結構つらいので。

差し込み口

  1. C の action 前後の filter ( before_filter, after_filter, around_filter )
  2. M の validation および create/save/destroy 前後の callback ( create, update, destroy は around もある )
    • さらに M の after_initialize, after_find などにも

ここに処理を挟み込むことで C や M のロジックを複雑にしないでデバッグのためにアレコレ仕込んで確認することができる。

cf.

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 の中。

確認方法

  1. rails console で主に model の method の確認
  2. rails server を立ち上げた terminal で次々に起こることを目視する
  3. p でそこに情報を吐き出す。(これはログには落ちない)
    • とても伝統的。rails server を実行している console に表示される。
  4. V なら debug を使う
  5. logger の設定を default から変更して logger インスタンスを起こす。この logger に必要な情報を吐き出す。
  6. 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

で、

  1. rails server -u ( –debugger ) でサーバを起動
  2. 好きな場所に 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 辺りか?

  1. こうすると無駄な処理が動かない 

More