カカリアスタジオブログ

Happy Elementsのゲームブランド「カカリアスタジオ」の公式ブログです。

Rubyist必携 pry-railsを使いこなせば幸せになれる


はじめに

エンジニアの@ryooo321です。
よろしくお願いします。

弊社では多くのプロジェクトでruby on railsを使っています。
ruby on railsで開発する上でrails consoleは欠かせない存在かと思います。
pry-railsを使うと、rails consoleをさらに高機能にできます。

今回は私の感じたpry-rails(と便利なgemいくつか)の便利利用法をいくつか紹介したいと思います。
※ 本記事はKyoto.rbでの発表内容をブログ向けにまとめなおしたものです。

下記ブログにpryの分かりやすい良記事がありまして、内容が重なる部分もありまして恐縮ですが、
ご存じない使い方が一つでもあれば幸いです。
Rubyistよ、irbを捨ててPryを使おう

Kyoto.rbについて

京都市周辺のRuby技術者が集まって刺激しあえる場を作っていこうとするコミュニティです。
毎週木曜日にMeetupを行っていますので、興味のある方はぜひご参加ください。
http://qwik.jp/kyotorb/

目次

1. installと起動
2. シェルコマンド
3. noecho;
4. シンタックス
5. gistにアップロード
6. オブジェクト調査
7. 自作のpryコマンドを追加
8. デバッグ
9. reload!
10. ルーティングやモデルを参照
11. 履歴が充実
12. ソースを参照
13. helpが充実




1. installと起動

インストール

gemで簡単にインストールできます。
# pry-railsはgemでinstallできます。
gem install pry-rails

# railsプロジェクトのGemfileに下記を追記します。
gem 'pry-rails'

起動

Gemfileに追記されていれば、いつものrails console起動コマンドでpryが立ち上がります。
rails console

[補足]Gemfileに追記したくない場合
Gemfileに追記しなくても、下記コマンドで起動できます。
pry -r ./config/environment




2. シェルコマンド

lsはともかく、rakeやgitコマンドが打てるのはありがたいです。
gitなどの認証プロンプトも問題ありません。
ruby の変数も展開して使えます。
.ls -la
.bundle exec rake db:migrate
.git commit -m ‘foobar’

# rubyの変数を使う
yyyymmdd = Date.today.strftime('%Y%m%d')
.touch tmp_#{yyyymmdd}




3. noecho;

irbで最終行の出力がechoされて必要なものが見づらくなることがあります。
pryならセミコロンをつけた行は結果が出力されないので、見やすくなります。

例えば、データのcreated_atを参照したいとします。
# irbの場合
irb(main):001:0> items = Item.all
irb(main):002:0> items.each do |item|
irb(main):003:1*   p item.created_at
irb(main):004:1> end
Wed, 17 Oct 2012 14:04:51 UTC +00:00
Wed, 17 Oct 2012 14:05:00 UTC +00:00
# ⬆⬆⬆見たい出力
# ⬇⬇⬇余計な出力
=> [#, #]; 

# pryの場合
[1] pry(main)> items = Item.all;
[2] pry(main)> items.each do |item|
             |   p item.created_at  
             | end;
Wed, 17 Oct 2012 14:04:51 UTC +00:00
Wed, 17 Oct 2012 14:05:00 UTC +00:00
# ⬆⬆⬆見やすい!




4. シンタックス

pryならシンタックスハイライトがデフォルトで表示されて、とても見やすいです。




5. gistにアップロード

ファイルや関数をgistにポストできます。
他のポストオプションはgist --helpで確認できます。
さらにgistのURLがクリップボードに入る気の利かせっぷりです。

# gistにファイル内容をポストする場合
gist -f app/controllers/items_controller.rb
Gist created at https://gist.github.com/38b0d0456e6816be9f3c and added to clipboard.

# ※ Gemfileに「gem 'jist'」を追加し、
# pryコンソール上でコマンドをインストールする必要があります。
install-command gist




6. オブジェクト調査

オブジェクトにcdできて、lsでオブジェクトのメソッドや変数を確認できます。
[1] pry(main)> items = Item.all
[2] pry(main)> cd items
               ⬆変数にcdできます。
               ⬇次行が「pry(#)」になります。
[3] pry(#):1> cd self.first
[4] pry(#):2> ls --grep tax
                    ⬆lsで関数を検索
                    ⬇Itemオブジェクトのメソッド・変数が表示されます。
Item#methods: tax price_with_tax




7. 自作のpryコマンドを追加

下記の関数でpryのコンソールで使えるコマンドを追加できます。
my_command_set = Pry::CommandSet.new do
  command "コマンド名", "helpコマンドでの説明" do |引数|
     # 処理
  end
end
Pry.config.commands.import my_command_set

railsプロジェクトディレクトリ直下に.pryrcを作成すると起動ごとにロードされますので、そこにコマンド追加処理を記載すると自動でロードされます。

こちらのgistに便利なコマンドが4つありました。
https://gist.github.com/1297510 ※ pconsole.shはpry-railsを使っているなら不要です。
railsプロジェクトディレクトリ直下に.pryrcを作って、上記gistのpryrc.rbの内容を記述すれば捗ります。

いずれも便利でしたのでお奨めします。
追加されるコマンド処理の概要
copy(contents)クリップボードにコピー
clearコンソールをクリアー
sql(query)sqlを実行
caller_method(depth)呼び出し元メソッドの情報を出力




8. デバッグ


pry-debuggerを使えばブレイクして変数の中身を書き換えたりステップ実行などが可能になります。
ブレイクポイントを打ったり条件停止なども可能です。

gemを追加

Gemfileに下記を追加すると使えるようになります。
gem 'pry-debugger'

使い方

ソースのbreakしたい箇所に下記を記述して、ブラウザなどで対象アクションをコールするとサーバーを立ち上げていたコンソールが停止してデバッグできます。
binding.pry

デバッグコマンド
コマンド意味
step関数の内部に入って1行進める
next現在の関数のレイヤーで1行進める
finish現在の関数を抜ける
continueデバッグを抜けてプログラムの実行を続ける
breakブレイクポイントを管理する




9. reload!

pry-railsならreload!が使えます。
reload!
Reloading...
=> true

# 標準のpryでは全体をリロードする機能がありません。
[2] pry(main)> reload-method ItemsController#index ← reload-methodなら可能
rails consoleを使っていた方は当たり前かと思われるかもしれませんが、pry-railsでも以前はデフォルトで使えない機能だったようです。




10. ルーティングやモデルを参照

show-routes

railsで定義したルーティングテーブルを参照できます。
show-routes
    items GET    /items(.:format)          items#index
          POST   /items(.:format)          items#create
 new_item GET    /items/new(.:format)      items#new
edit_item GET    /items/:id/edit(.:format) items#edit
     item GET    /items/:id(.:format)      items#show
          PUT    /items/:id(.:format)      items#update
          DELETE /items/:id(.:format)      items#destroy

# grepすることで絞り込みもできます。
show-routes --grep destroy

show-models

MySQLのテーブル定義を参照できます。
show-models
Item
  id: integer
  name: string
  created_at: datetime
  updated_at: datetime

※ grepすることで一致した文字列が赤く表示されます。
show-models --grep created_at

show-middleware

railsで利用しているミドルウェアを参照できます。
show-middleware
use ActionDispatch::Static
use Rack::Lock
use ActiveSupport::Cache::Strategy::LocalCache
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions




11. 履歴が充実

histコマンドが充実していて、再実行やgrepができます。
 hist --help
Usage: hist
       hist --head N
       hist --tail N
       hist --show START..END
       hist --grep PATTERN
       hist --clear
       hist --replay START..END
       hist --save [START..END] FILE




12. ソースを参照

find-methodでメソッドを検索

[1] pry(main)> find-method before_filter
AbstractController::Callbacks::ClassMethods
AbstractController::Callbacks::ClassMethods#before_filter
AbstractController::Callbacks::ClassMethods#prepend_before_filter
AbstractController::Callbacks::ClassMethods#skip_before_filter
AbstractController::Callbacks::ClassMethods#append_before_filter

show-methodでソースを参照

※ show-sourceのエイリアスです。
[1] pry(main)> show-method 'hoge'.pluralize

From: path to gem/activesupport-3.2.8/lib/active_support/core_ext/string/inflections.rb @ line 25:
Number of lines: 7
Owner: String
Visibility: public

def pluralize(count = nil)
  if count == 1
    self
  else
    ActiveSupport::Inflector.pluralize(self)
  end
end

edit-methodでエディタを開く

下記コマンドでエディタが開きます。
vimやSublimeText2やemacsで開くこともできます。(後述)
edit-method 'hoge'.pluralize

下記コマンドでエディタを変更できます。(永続化するには.pryrcに記述)
# vimの場合
Pry.config.editor="vim"

# 流行のSublime Text 2 @macなら下記でいけます。
Pry.config.editor="/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl"

# コマンドラインから起動するシムリンクを貼れば下記でいけます
Pry.config.editor="subl"
# 起動シムリンク
ln -s "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" /usr/local/bin/subl

gemのドキュメントを参照

※ gem 'pry-doc'が必要です。
show-doc ActiveRecord::Base

ri

rdocドキュメントを読めます。
※ gem installで-no-riしている場合はもちろん見れません。
[1] pry(main)> ri Hash#delete_if
Hash#delete_if

(from ruby core)
------------------------------------------------------------------------------
  hsh.delete_if {| key, value | block }  -> hsh
  hsh.delete_if                          -> an_enumerator
   

------------------------------------------------------------------------------

Deletes every key-value pair from hsh for which block evaluates
to true.

If no block is given, an enumerator is returned instead.

  h = { "a" => 100, "b" => 200, "c" => 300 }
  h.delete_if {|key, value| key >= "b" }   #=> {"a"=>100}




13. helpが充実

helpとタイプすると、pryのメソッドを確認できます。
さらに、pryのメソッドに--helpをつけることでメソッドのオプションを確認できます。




14. 関連情報

・公式
http://pryrepl.org/
github wiki(とても詳細な設定や機能説明が記載されています。)
https://github.com/pry/pry/wiki

一緒に働きたい方、絶賛 募集中
京都で開発してみたいというエンジニアの皆さん、ご応募お待ちしています!
技術力を伸ばしたい学生さん、アルバイトも可能なのでご応募お待ちしています!
大阪、滋賀、神戸から通勤実績があります

© Happy Elements K.K