最近ruby on Railsで開発をしていてrails cをよく使い、とても便利だと思ったのでまとめておきます。使い方を網羅的にではなく自分が使ってて便利だったと思ったことを書きます。
index
#####1. rubyをインタラクティブに実行する
#####2. pry-railsを使ってみる
#####3. binding-pryを使ってみる
1. rubyをインタラクティブに実行する
これはrails cじゃなくてもrubyをPCに入れていれば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(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(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ではレコードを作成することができます。まだフォームは作っていないが、データを1件くらい入れて確かめたいときに便利です。
[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
以下のように一行で書くこともできます。
[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を使うときに使いやすいです。
gem "pry-rails"
gem "pry-byebug"
とGemfileに書いて、bundle installを行うとrails cを行ったときに出てくるのが、irbではなくてpryになる。ここで使えるコマンドがshow-modelsとshow-routesです。そうすることにより、ルーティングとテーブルを見ることが出来ます。
[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よりも早く表示させられるらしいです。
[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への理解も深まります。
下のコードはあるレコードを作るときにどのような流れで作られているかを示している物です。
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を使ってみてください。