すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 rails console(rails c)の便利な使い方とは?

ぴっかちゃん
ぴっかちゃん

consoleコマンドは、コマンドラインでRailsアプリケーションとやり取りすることが出来ます。サーバーのデータを変更する時やRailsアプリケーションに定義したメソッドを試す時に便利です。

Railsアプリケーションのコンソールに接続して、データベースのデータを追加したい場合を見ていきましょう。

次の画像は、users_appのアプリケーションで利用してるデータベースの中身です。

users_appが利用しているデータベース

usersテーブルにデータを追加するために、次の動画のようにrails consoleを実行してコンソールを起動します。

コンソールからデータを保存する

そして、コンソール上でcreateメソッドを使ってUserモデルのインスタンスを生成しデータベースに保存すると、次の画像のようにusersテーブルにデータが追加されます。

データの保存することが出来たか確認

このようにrails consoleを実行して、Railsアプリケーションのコンソールに接続することによって、データの操作をコンソール上で行うことが出来ます。

consoleコマンドには、他にも便利な使い方が沢山あるので1つ1つ整理しながら学んでいきましょう。

consoleコマンドの使い方

この章では、コンソールの起動方法やオプション、コンソールで使えるメソッドについて解説します。画像や動画を使って解説しているので、コマンドの実行結果まで確認することが出来ます。

どんなことが出来るのか?

rails consoleを実行すると、コンソールが起動します。このコンソールでRailsアプリケーションとやり取りすることが出来ます。

具体的には、Railsアプリケーションで作成中、もしくは作成したメソッドを試すことが出来たり、モデルを操作してデータベースにデータを反映させることが出来ます。

また、consoleコマンドのオプションや環境を指定して起動させれば、様々な状況に合わせてコンソールを使うことが出来ます。

コンソールを起動する

コンソールを起動するには、ターミナルでRailsアプリケーションのルートディレクトリに移動して、次のコマンドを実行します。

ターミナル | コンソールを起動する-->
1
rails console

consolecというエイリアスが使えるので、次のようにrails cで実行することも出来ます。

ターミナル | コンソールを起動する-->
1
rails c

コンソールを終了するには、コンソールでexitquitを実行します。

コンソール | コンソールを終了する-->
1
2
3
exit
#もしくは以下を実行する
quit

それでは、users_appのコンソールを起動させて終了させてみます。

users_appのコンソールを起動させて終了させる

users_appのルートディレクトリでrails consoleを実行することで、コンソールを起動させることが出来ていますね。そして、コンソールの終了にはexitまたはquitを実行しています。

ポイント
  1. コンソールを起動するには、Railsアプリケーションのルートディレクトリでrails consolerails cを実行する
  2. コンソールを終了するには、exitquitを実行する

オプションを使う

consoleコマンドには、次のようにオプションを指定することが出来ます。
今回は、オプションの中でもよく使う-sandboxについて解説します。

ターミナル | オプションを指定してコンソールを起動する-->
1
rails console [オプション]

-sandbox

-sandboxを付けてコンソールを起動すると、終了時にコンソールで変更したデータを元に戻すことが出来ます。

ターミナル | -sandboxを付けてコンソールを起動する-->
1
2
rails console -sandbox
rails console -s #同上

上記のコマンドを実行すると、次の画像のようにrails cを実行した場合と違って、in sandboxが追加されます。

rails c -sをした場合の比較

この状態で、次の画像のようにデータを新規に作成してもコンソールを終了(exit)すれば、元に戻すことが出来ます。

コンソールがロールバックする様子

usersテーブルを確認しても、山田太郎さんのデータは追加されていませんね。

usersテーブルにデータが反映されている確認

このように-sandboxは、コンソールを終了するとデータを元に戻すことができるので、データを変更せずにRubyのコードを試したい時に便利です。

環境を指定する

Railsには、以下の3つの環境が用意されています。

  • develop - 【開発環境】アプリケーション開発を行う作業場所
  • test - 【テスト環境】作成した機能などをテストする場所
  • production - 【本番環境】完成したアプリケーションをユーザーが利用する場所

コンソールを起動する際には、次のように環境を指定することが出来ます。

ターミナル | 環境を指定してコンソールを起動する-->
1
rails console [環境]

例えば、Railsアプリケーションの本番環境でコンソールを起動したい場合は、次のようにproductionを指定して実行します。

ターミナル | productionを指定してコンソールを起動する-->
1
rails c production

次の画像のようにデフォルトでは開発環境でしたが、productionを指定すると本番環境でコンソールを起動を起動することが出来ます。

本番環境と開発環境でコンソールを起動させる

また、次のコードのようにenvメソッドで現在の環境を調べることが出来ます。

コンソール | 現在の環境を調べる
1
2
irb(main):001:0> Rails.env
=> "production"

Railsの環境を詳しく知りたい方は、「Railsの3つの環境と役割とは?」を参考にしてください。

Rails6以降の場合

Rails6以降の場合は、rails c [環境]だと次のようにエラーが発生します。

ターミナル | productionを指定してコンソールを起動する
1
2
3
rails c production
ERROR: "rails console" was called with arguments ["production"] (Thor::InvocationError)
Usage: "rails console [options]"

この場合は、次のいずれかのコマンドを実行するとコンソールを起動することができます。

ターミナル | Rails6以降で環境を指定してコンソールを起動する場合
1
2
3
4
RAILS_ENV=[環境] rails c 
rails c --environment [環境]
#もしくは以下を実行する
rails c -e [環境]

例えば、本番環境でコンソールを起動する場合は、次のように指定します。

ターミナル | Rails6以降で本番環境でコンソールを起動する場合
1
2
3
RAILS_ENV=production rails c
rails c --environment production
rails c -e production

本番環境でコンソールを起動している例

ぴっかちゃん

Rails 6.0も含めて広い範囲を体系的に学びたいという方は、この参考書が良いでしょう。

appメソッドとhelperメソッド

コンソール上でappメソッドやhelperメソッドを使用すると、ヘルパーの取得や名前付きルーティングヘルパーで生成されるパスを調べたり、リクエストを投げることができます。

ルーティングヘルパーで生成されるパスを調べる

名前付きルーティングヘルパーで生成されるパスは、appメソッドを使って調べることができます。

Console | 生成されるパスを取得する
1
2
3
4
irb(main):001:0> app.users_path
=> "/users"
irb(main):002:0> app.users_url
=> "http://localhost:3000/users"

上記のルーティングヘルパー(pathヘルパーやurlヘルパー)は、次のようにresourcesメソッドでルーティングを定義した場合に使うことができます。

config/routes.rb | resourcesでルーティングを定義する-->
1
2
3
Rails.application.routes.draw do
resources :users
end

ルーティングヘルパーの使い方については、「Prefixとは?」を参考にして下さい。

リクエストを投げる

appメソッドを使えば、コンソール上でリクエストを投げることができます。

Console | リクエストを投げる
1
2
irb(main):001:0> app.get "http://localhost:3000/users" 
=> 200

上記では、ステータスコードの200を返していますね。これは、リクエストが成功し、正常なレスポンスが返ったという意味です。

レスポンスの中身は、次のコードを実行すると確認することができます。

Console | レスポンスを確認する
1
2
3
4
5
irb(main):002:0> app.response.body
=> "<!DOCTYPE html>\n<html>\n <head>\n <title>UsersApp</title>\n <meta name=\"csrf-param\" content=\"authenticity_token\" /> \n<meta name=\"csrf-token\" content=\"55ssWbjmO964gtnliGifBT2kVQ8eKSjIBSDTORJxjUYgM/dhpXbwHhx2d9S9vpjYUmSK8//WxeSshYV/SBvJgA==\" />\n \n\n <link rel=\"stylesheet\" media=\"all\" href=\"/assets/application.debug- ec6f5f383ea57e6f33bb1140831d2e69fd135e29f145864e7e897fe2790ea885.css\" />\n <script src=\"/packs/js/application-cd9baa997ab2a6e5febb.js\"></script>\n </head>\n\n <body>\n <p id=\"notice\"></p>\n\n<h1>Users</h1>\n\n<table>\n <thead>\n <tr>\n <th>Name</th>\n <th>Age</th>\n <th colspan=\"3\"></th>\n </tr>\n </thead>\n\n <tbody>\n <tr>\n <td>田中ゆうこ</td>\n <td>18</td>\n <td><a href=\"/users/1\">Show</a></td>\n <td><a href=\"/users/1/edit\">Edit</a></td>

ヘルパーを呼び出す

helperメソッドを使えば、Railsアプリケーションのヘルパーを呼び出すことができます。

例えば、Railsに用意されているbutton_toをコンソール上で呼び出したい場合は、次のコードを実行します。

Console | button_toにアクセスする
1
2
irb(main):001:0> helper.button_to 'ユーザー登録', app.new_user_path, method: :get
=> "<form class=\"button_to\" method=\"get\" action=\"/users/new\"><input type=\"submit\" value=\"ユーザー登録\" /></form>"

コンソール上で実行しているので、button_toに指定する名前付きルーティングヘルパーは、appメソッドを使ってapp.new_user_pathと指定します。

返り値は、ヘルパーのHTMLを返すのでヘルパーのメソッドがどんなHTMLを出力するのか知りたい時も便利ですね。

コンソールに変更点を反映させる

コンソール上でreload!を実行すると、コンソールを再起動することなく変更点を反映させることができます。

Console | reload!を実行する
1
irb(main):001:0> reload!

例えば、コンソールを起動した状態で次のようにクラスメソッドを追加したとします。

app/models/user.rb | クラスメソッドを追加する-->
1
2
3
4
5
6
class User < ApplicationRecord
  #クラスメソッドを追加
def self.say_hello
'hello!'
end
end

そして、上記で定義したsay_helloクラスメソッドを次のように元々起動していたコンソール上で呼び出した場合は、反映されていないので未定義のエラーが発生します。

Console | Userクラスに追加したクラスメソッドを呼び出す
1
2
3
4
irb(main):001:0> User.say_hello
Traceback (most recent call last):
        1: from (irb):1
NoMethodError (undefined method `say_hello' for User (call 'User.connection' to establish a connection):Class)

この時コンソールに反映させる為に再起動が必要ですが、コードを変更するたびに再起動するのは億劫ですよね。

そこでreload!を実行すれば、次のコードのように再起動することなく変更点を反映することができるので便利です。

Console | reload!を実行して変更点を反映させる
1
2
3
4
5
irb(main):002:0> reload!
Reloading...
=> true
irb(main):003:0> User.say_hello
=> "hello!"

データベースを操作する

ActiveRecordのメソッドを使ってコンソール上でデータベースを操作する事ができます。データベースの中身をSQLを組み立てる事なく確認することができるので便利です。

例えば、次のコードのようにfindメソッドを使って引数に指定したidのレコードを取得できます。

Console | findメソッドでid3のレコードを取得する
1
2
3
irb(main):001:0> User.find(3)
SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
=> #<User id: 3, name: "高橋なおき", age: 33, created_at: "2020-09-17 17:39:53", updated_at: "2020-09-17 17:39:53">

主なActiveRecordのメソッドは、次の通りです。

ActiveRecordのメソッド 内容 Pikawakaの記事
allメソッド 全てのレコードを返す 記事を読む»
findメソッド 指定したidのレコードを返す 記事を読む»
find_byメソッド 検索でヒットしたレコードの最初の一件だけを返す 記事を読む»
newメソッド インスタンスを生成する
saveメソッド インスタンスをデータベースに保存する 記事を読む»
createメソッド インスタンス生成とデータベースに保存する 記事を読む»
updateメソッド レコードの情報を更新する 記事を読む»

次の動画のように、コンソールで上記のcreateメソッドやupdateメソッドなどデータベースを変更するメソッドを試そうとすると、実際に反映されてしまうので注意して下さい。

createメソッドを実行してデータベースに反映する例

データベースの内容を変更せずにメソッドを試したい場合は、-sandboxのオプションでコンソールを起動させて下さい。

コンソールをirbからpryに変更した場合

Railsアプリケーションにgemのpry-railsをインストールすると、コンソールをirbからpryに変更することができます。

コンソールをpryに変更すると、表示が見やすくなるので可読性が上がったり、便利なコマンドやメソッドで効率よくデバックをすることができます。

表示が見やすくなる

pryをインストールする前は、次のようにusersテーブルからレコードを全て取得してもデータが分かりづらい状態でした。

irbの場合の表示

しかし、次の動画のようにpryに変更することで、インデントや改行、カラーリングがされるので表示がとても見やすくなります。

pryの場合の表示

便利な組み込みコマンドが使える

見た目が分かりやすくなるだけではなく、pryの便利な組み込みコマンドを使うことが出来ます。

便利なコマンドの1つにshow-modelsがあります。
show-modelsは、現在のモデル全てを確認することができるコマンドです。

Console | show-modelsを実行してモデルを確認する
1
[1] pry(main)> show-models

 show-modelsを実行してモデルを確認する

他にも便利なコマンドやbinding.pryで効率よくデバックが出来ます。
pry-railsを使ってみたい方は、是非こちらの「Pryについて徹底解説!」を参考にしてみて下さい。

この記事のまとめ

  • consoleコマンドは、コマンドラインでRailsアプリケーションとやり取りすることが出来る
  • サーバーのデータを変更するときや定義したメソッドを試すときに便利!
  • -sandboxを付けてコンソールを起動すれば、終了時にコンソールで変更したデータを元に戻すことが出来る