Railsにおけるデバッグ方法のあれこれ
基本は pry
を使います(gemとしては pry-rails
ですが)
1. 前提
テストしやすいように
GitHub - lion-man44/sandbox-rails: railsのいろいろな説明用
にRails環境をあげてあります
出来るだけ最小ケース(あんまりバカスカgemを入れてない状態)でデバッグできるような内容を重きに置いてあります
自プロジェクトで導入する場合は導入方法はこちら
動かし方はこちら です
2. 環境
Rails 5系以上 Ruby 2.6.0 (せっかくなので) pry-rails 3.8
3. 起動方法
https://github.com/lion-man44/sandbox-rails
に書いてあるのでそちらを参考にしてください
ちなみに、 docker
などを活用していない場合は下記のコマンドでそれぞれおこないます
- ローカルサーバーの起動方法
bundle exec rails s # or $RAILS_ROOT/bin/rails s
bundle exec rails c # or $RAILS_ROOT/bin/rails c
4. 確認方法
- 一体何のmethodがあるのか知りたい
[].methods # public and protected [].public_methods # only public [].private_methods # only private
- 大量のmethod名の中から自分が想定されるメソッドがあるか知りたい
- Enamerableな要素に対してgrepが行えますので、いろいろと調べたい時は便利です(これを実装で使うパターンはあんまりないと思います)
[].methods.grep /allow/
- 祖先が知りたい
- concernも調べらたりするので何を継承しているのか知ることができる
class.ancestors
- そもそもglobalに何が定義されているのか知りたい
- これは
rails c
よりもrails s
でそのmethodで調べたい時の方が効果があります
- これは
ls # いっぱい出てきて戸惑うかもしれませんが、ゆっくり読んでいけば一体何が今展開されているのか読むことができます
ちなみに cd ${調べたいmethod}
などで移動することができます
- ActionViewなどのform tagを作るためのものをデバッグしたい
[111] pry(main)> helper.select :users, :id, [['a', 1], ['b', 2]] => "<select name=\"users[id]\" id=\"users_id\"><option value=\"1\">a</option>\n<option value=\"2\">b</option></select>"
- controllerのメソッドをデバッグしたい
もうここに書いてあること実行すればできます
5. まとめ
思いつくだけババっと書いてみました
これらを駆使すればデバッグできるけど、といった内容です
しかし結局のところはデバッグ方法をいくら知っていたとしてもそのフレームワークの規約などから外れているといくらデバッグ機能が優秀だとしても理解が及ばない時があり、その時は結局苦戦することになります
Railsの場合、他と特色が違うなと思うのは大体の思いついたことをメソッド名にして探してみると大体あるな、というのが長年触っていてあります
「継承しているものを知りたい」→「祖先が知りたい」→「 ancestors
というメソッドがあるじゃん」
みたいな流れで大体気付いたりすることが多いです(「祖先が知りたい」という部分が出てこない場合はありますがw)
まずはやりたいことをggってみるだけでも割とたどり着けることが多いです