Railsでアプリケーションを作成しているときに、ViewファイルやControllerの中にある変数にどのような値が渡されているかを確認したいときがあります。(いわゆるデバッグです)
ここでは、View(ビュー)とController(コントローラ)で変数の中身を確認すると、Modelの中のデータを確認する方法や、ロケールファイル(local)のデータを確認する方法について実例で解説しています。
コントローラ(controller)の中でデバッグする方法
コントローラ(controller)の中でデバッグする主な方法には、以下の3つがあります。
以下でそれぞれの方法について解説しています。
ppメソッドを使う
最もシンプルな方法は「pp」メソッドを使うことです。
pp @変数名
複数の変数を出力したい場合はカンマでつなぎます。
pp @変数名1, @変数名2,,,,
Pritty Printの略です。Pritty Printとはインデントをつけるなど人間が見やすいように可視化する機能です。
なお、Railsはppで指定した値をコンソールに出力します。
実例
例えば以下のように「@footerTexts」という変数の中身を確認したい場合はpp @footerTexts
と記述します。
class TopController < ApplicationController
def index
@footerTexts = [ ['kumasanについて', '入れ子'], 'ヘルプセンター', '利用規約', 'プライバシーポリシー']
pp @footerTexts
end
end
保存してページをリロードすると、アプリケーションを起動しているコンソールに変数の中身が表示されます。
putsメソッドを使う
putsメソッドを使って変数の中身を表示することも可能です。
puts @変数名
実例
例えば以下のように「@footerTexts」という変数の中身を確認したい場合はputs @footerTexts
と記述します。
class TopController < ApplicationController
def index
@footerTexts = [ ['kumasanについて', '入れ子'], 'ヘルプセンター', '利用規約', 'プライバシーポリシー']
puts @footerTexts
end
end
保存してページをリロードすると、アプリケーションを起動しているコンソールに変数の中身が表示されます。
変数の中の構造が見えないので、pp
に軍配があがります。
logger.debugを使う
3つ目の方法はlogger.debugを使う方法です。
logger.debug(@変数名)
出力される内容は「pp」と同じくフォーマットされたものが表示されます。
実例
例えば以下のように「@footerTexts」という変数の中身を確認したい場合はlogger.debug(@footerTexts)
と記述します。
class TopController < ApplicationController
def index
@footerTexts = [ ['kumasanについて', '入れ子'], 'ヘルプセンター', '利用規約', 'プライバシーポリシー']
logger.debug(@footerTexts)
end
end
保存してページをリロードすると、アプリケーションを起動しているコンソールに変数の中身が表示されます。
出力内容はpp
と同じですが、コードの文字数の少なさからppに軍配があがります。
ビュー(View)の中でデバッグする方法
Viewファイルの中でデバッグする方法には主に次の2つがあります。
以下でそれぞれの方法について解説しています。
<%= @変数名 %>を使う
HTMLの中に<%= %>というタグを作成して、その中に表示したい変数名を記述することで、記述した場所に変数の内容を表示することができます。
<%= @変数名 %>
実例
例えば以下のように「@footerTexts」という変数の中身を確認したい場合は<%= @footerTexts %>
と記述します。
<%= @footerTexts %>
▼画面の表示例
<%= debug @変数名 %>を使う
HTMLの中に<%= %>というタグを作成して、その中に「debug 変数名」とすることで記述した場所に変数の内容を表示することができます。
<%= debug @変数名 %>
実例
例えば以下のように「@footerTexts」という変数の中身を確認したい場合は<%= debug @footerTexts %>
と記述します。
<%= debug @footerTexts %>
▼画面の表示例
yaml形式で表示されます。
Model(モデル)でテーブルの中身を確認する方法
Modelを使って取得したデータベースのテーブルの中のデータを確認したいときは、Railsの対話モードが便利です。
rails c
「c」は「console」の略です。
モデル名.メソッド
でデータを呼び出すことができます。
実例
まずはRailsのコンソールを起動します。
# rails c
Running via Spring preloader in process 55
Loading development environment (Rails 6.1.3.1)
irb(main):001:0>
モデル名.メソッド
でデータを呼び出すことができます。「User」モデルの全データを表示したい場合は「all」メソッドを使って「User.all」とします。
irb(main):008:0> User.all
User Load (0.6ms) SELECT "users".* FROM "users" /* loading for inspect */ LIMIT $1 [["LIMIT", 11]]
=> #<ActiveRecord::Relation []>
localeファイルの中身を確認する方法
locale(ロケール)の指定したプロパティの値を表示する方法には以下の3つの方法があります。
以下でそれぞれの方法を解説します。
Controller(コントローラ)で表示する
デバッグ方法
コントローラの中でロケールに記述したデータを表示するには「pp」を使います。
localeを指定するときに入れ子になっているデータはt('プロパティ名.プロパティ名…')
といったようにプロパティ名をつなげて指定します。
pp t('プロパティ名1.プロパティ名2,,,,')
実例
localeファイルとして、次のようなja.ymlがあるとします。
ja:
test: テスト
xxx:
test: 深いテスト
子の中の「test」と、「xxx」の中の「test」を参照する場合は以下のように記述します。
class TopController < ApplicationController
def index
pp t('test')
pp t('xxx.test')
end
end
保存してページをリロードすると、アプリケーションを起動しているコンソールに変数の中身が表示されます。
注意点
ja.ymlに指定した値が存在しない場合は、translation missing: 入力した値
が表示されます。
pp t('dummy')
pp t('xxx.存在しない')
▼画面の表示
View(ビュー)で表示する
デバッグ方法
View(ビュー)の中でlocaleの値を表示する場合は、<%= %>タグを使って以下のように記述します。
<%= t('プロパティ名') %>
入れ子になっているデータはt('プロパティ名.プロパティ名…')
といったようにプロパティ名をつなげて指定します。
<%= t('プロパティ名1.プロパティ名2,,,,') %>
実例
localeファイルとして、次のようなja.ymlがあるとします。
ja:
test: テスト
xxx:
test: 深いテスト
子の中の「test」と、「xxx」の中の「test」を参照する場合はビューファイルの中で以下のように記述します。
<%= t('test') %>
<%= t('xxx.test') %>
保存してページをリロードすると、記述した場所に指定したlocaleの内容が表示されます。
▼ブラウザの表示
注意点
ja.ymlに指定した値が存在しない場合は、入力した値がそのまま表示されます。(入れ子の場合は末尾のプロパティ名が表示されます。)
<%= t('dummy') %>
<%= t('yyy.存在しない') %>
railsコンソールで表示する
localeファイルの指定したプロパティをrailsコンソール上で表示することもできます。
まずは、railsのコンソールに入ります。
rails c
なお「c」は「console」の略です。
railsコンソールで「I18n」と「tメソッド」を使うと、指定した値を表示することができます。
I18n.t('プロパティ名')
入れ子になっているデータはt('プロパティ名.プロパティ名…')
といったようにプロパティ名をつなげて指定します。
I18n.t('プロパティ名1.プロパティ名2,,,,')
実例
localeファイルとして、次のようなja.ymlがあるとします。
ja:
test: テスト
xxx:
test: 深いテスト
それぞれのプロパティの値をrailsコンソールで表示する場合は以下のようになります。
# rails c
Running via Spring preloader in process 197
Loading development environment (Rails 6.1.3.1)
irb(main):002:0> I18n.t('test')
=> "テスト"
irb(main):001:0> I18n.t('xxx.test')
=> "深いテスト"
注意点
指定した値が存在しない場合
ja.ymlに指定した値が存在しない場合は、translation missing: 入力した値
が表示されます。
localeファイルの内容を修正・変更した場合
localeファイルの内容を修正・変更した場合、変更内容はリアルタイムで反映されません。
このため、後からlocaleのja.ymlを変更した場合は、一旦railsコンソールを「exit
」で抜けて、「rails c
」で再度対話モードに入る必要があります。