rails console(rails c) の便利な使い方（irb,pry）

最近ruby on Railsで開発をしていてrails cをよく使い、とても便利だと思ったのでまとめておきます。使い方を網羅的にではなく自分が使ってて便利だったと思ったことを書きます。

## index
#####1. rubyをインタラクティブに実行する
#####2. pry-railsを使ってみる
#####3. binding-pryを使ってみる

## 1. rubyをインタラクティブに実行する

これはrails cじゃなくてもrubyをPCに入れていればirbを使うことによって実行することができます。もちろん下のように単純な計算も実行できます。

```irb

irb(main):022:0> a = 3
=> 3
irb(main):023:0> b = 5
=> 5
irb(main):024:0> a + b
=> 8
```


railsで便利なのは以下のようにリテラルのクラスだったり、親クラスだったり、メソッドだったりをみることができることである。rubyのオブジェクト指向のきれいさを改めて実感することができる。また、テーブルのレコードのクラス名や

以下はリテラルのクラスを確認する例で.classというメソッドを使っている。

```irb

irb(main):001:0> "aiueo".class
=> String
irb(main):002:0> 1.class
=> Fixnum
irb(main):003:0> {}.class
=> Hash
irb(main):004:0> :aiueo.class
=> Symbol
irb(main):005:0> [].class
=> Array
```

また.superclassというメソッドを使って親クラス（継承元クラス）を調べることができます。下の画像より、文字列であるStringクラスの親クラスはObjectクラスでありその親クラスはBasicObjectクラスであることが分かります。また、BasicObjectクラスの親クラスはnilであることから、BasicObjectクラスが根本のクラスであることが分かります。またすべてのクラスの元をたどっていくとBasicObjectクラスにたどり着きます。

```irb
irb(main):007:0> String.superclass
=> Object
irb(main):008:0> String.superclass.superclass
=> BasicObject
irb(main):009:0> String.superclass.superclass.superclass
=> nil
```

rails cではレコードを作成することができます。まだフォームは作っていないが、データを１件くらい入れて確かめたいときに便利です。

```irb
[1] irb(main)> book = Book.new
=> #<Book:0x00007f6688ab2278 id: nil, title: nil, body: nil, created_at: nil, updated_at: nil>
[2] irb(main)> book.title = "aa"
=> "aa"
[3] irb(main)> book.body = "bb"
=> "bb"
[4] irb(main)> book.save
   (0.1ms)  begin transaction
  Book Create (4.9ms)  INSERT INTO "books" ("title", "body", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "aa"], ["body", "bb"], ["created_at", "2018-09-28 13:03:06.406855"], ["updated_at", "2018-09-28 13:03:06.406855"]]
   (3.2ms)  commit transaction
=> true
```
以下のように一行で書くこともできます。

```irb
[1] irb(main)> Book.create(title: "aa",body: "bb")
   (0.1ms)  begin transaction
  Book Create (8.3ms)  INSERT INTO "books" ("title", "body", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "aa"], ["body", "bb"], ["created_at", "2018-09-28 13:05:21.899677"], ["updated_at", "2018-09-28 13:05:21.899677"]]
   (4.2ms)  commit transaction
=> #<Book:0x00007f668885ee18 id: 2, title: "aa", body: "bb", created_at: Fri, 28 Sep 2018 13:05:21 UTC +00:00, updated_at: Fri, 28 Sep 2018 13:05:21 UTC +00:00>
```

##2. pry-railsを使ってみる
このときにpry-byebugも一緒に入れるとbinding.pryを使うときに使いやすいです。

```:Gemfile
gem "pry-rails"
gem "pry-byebug"
```
とGemfileに書いて、bundle installを行うとrails cを行ったときに出てくるのが、irbではなくてpryになる。ここで使えるコマンドがshow-modelsとshow-routesです。そうすることにより、ルーティングとテーブルを見ることが出来ます。

```pry 
[1] pry(main)> show-models
ApplicationRecord
  Table doesn't exist
Book
  id: integer
  title: string
  body: string
  created_at: datetime
  updated_at: datetime
Group
  id: integer
  group_name: string
  created_at: datetime
  updated_at: datetime
  has_many :members
```

show-modelsではアソシエーションが読み込まれているかも表示されます。また、show-routesはrails routesよりも早く表示させられるらしいです。

```pry
[1] pry(main)> show-routes
                   Prefix Verb   URI Pattern                                                                              Controller#Action
                new1_book GET    /books/new1(.:format)                                                                    books#new1
              create_book POST   /books(.:format)                                                                         books#create1
                     root GET    /                                                                                        books#index
                   groups GET    /groups(.:format)                                                                        groups#index
                          POST   /groups(.:format)                                                                        groups#create
                new_group GET    /groups/new(.:format)                                                                    groups#new
               edit_group GET    /groups/:id/edit(.:format)                                                               groups#edit
                    group GET    /groups/:id(.:format)                                                                    groups#show
                          PATCH  /groups/:id(.:format)                                                                    groups#update
                          PUT    /groups/:id(.:format)                                                                    groups#update
                          DELETE /groups/:id(.:format)                                                                    groups#destroy
                    posts GET    /posts(.:format)                                                                         posts#index
                          POST   /posts(.:format)                                                                         posts#create
                 new_post GET    /posts/new(.:format)                                                                     posts#new
                edit_post GET    /posts/:id/edit(.:format)                                                                posts#edit
                     post GET    /posts/:id(.:format)                                                                     posts#show
                          PATCH  /posts/:id(.:format)                                                                     posts#update
                          PUT    /posts/:id(.:format)                                                                     posts#update
                          DELETE /posts/:id(.:format)                                                                     posts#destroy
                    books GET    /books(.:format)                                                                         books#index
                          POST   /books(.:format)                                                                         books#create
                 new_book GET    /books/new(.:format)                                                                     books#new
                edit_book GET    /books/:id/edit(.:format)                                                                books#edit
                     book GET    /books/:id(.:format)                                                                     books#show
                          PATCH  /books/:id(.:format)                                                                     books#update
                          PUT    /books/:id(.:format)                                                                     books#update
                          DELETE /books/:id(.:format)                                                                     books#destroy

```

##3. binding.pryを使ってみる
binding.pryはrailsで開発する上で必須であるであろうデバッグツールです。コントローラーの途中で実行を止めることができ、どの変数にどんな値が入っているか確認することが出来ます。また、gem "pry-byebug"により、止めた位置から一行ずつ実行することが出来ます。そのため、どのように実行されているかが分かりrailsへの理解も深まります。

下のコードはあるレコードを作るときにどのような流れで作られているかを示している物です。

```ruby
    28: def create2
    29: 	binding.pry
 => 30: 	book = Book.new(book_params)
    31: 	book.save
    32: 	redirect_to books_path
    33: end

[1] pry(#<BooksController>)> book_params
=> <ActionController::Parameters {"title"=>"ddd"} permitted: true>
[2] pry(#<BooksController>)> next

From: /vagrant/bookers/app/controllers/books_controller.rb @ line 31 BooksController#create2:

    28: def create2
    29: 	binding.pry
    30: 	book = Book.new(book_params)
 => 31: 	book.save
    32: 	redirect_to books_path
    33: end

[2] pry(#<BooksController>)> book
=> #<Book:0x00007f0c74ce3a10 id: nil, title: "ddd", body: nil, created_at: nil, updated_at: nil>
[3] pry(#<BooksController>)> next
   (0.4ms)  begin transaction
  ↳ app/controllers/books_controller.rb:31
  Book Create (5.8ms)  INSERT INTO "books" ("title", "created_at", "updated_at") VALUES (?, ?, ?)  [["title", "ddd"], ["created_at", "2018-09-28 13:40:30.163883"], ["updated_at", "2018-09-28 13:40:30.163883"]]
  ↳ app/controllers/books_controller.rb:31
   (4.4ms)  commit transaction
  ↳ app/controllers/books_controller.rb:31

From: /vagrant/bookers/app/controllers/books_controller.rb @ line 32 BooksController#create2:

    28: def create2
    29: 	binding.pry
    30: 	book = Book.new(book_params)
    31: 	book.save
 => 32: 	redirect_to books_path
    33: end

```

こんな感じでrails cを使ってみてください。