2011-02-22

今さら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. こうすると無駄な処理が動かない 

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm