実践で学ぶRuby on rails 〜仮説千本ノック〜

プログラマーとして独立するため日々スキルアップに励んでいます。優れたプログラマは仮説を立てるのがうまい。そこを目指して仮説を立てては検証する日々です!!

エラー確認(binding.pry編)

アクションや、ビューファイル内に記述することで、

アクションやビューファイルの読み込みを途中で止めて、

変数に格納されている中身を確認できるbinding.pry

 

何にでも使えるわけではなく、

ruby,rails用のエラー確認ツールとなっています。

とはいえ、html,hamlファイルにおいても、

-や=を使った構文はrails扱いとなるため、

- @group.errors.full_messages.each do |message|
-binding.pry
%li= message

これらのrails記法が使われていれば、その部分にはbinding.pryを記述することができます。

その際、-binding.pryと「-」をつけ、binding.pry自体をruby化させることも忘れずに。

 

■サンプルケース

ビューファイルに正しいエラーメッセージが表示されない。

そこで、新規グループ作成ページで、グループ名が空のまま登録した場合に起動するerrors.full_messagesメソッドをeach文で書いた時の変数messageに正しいメッセージ(グループ名が入力されておりません)が格納されているかを確認したい。

 

確認作業は4つあります

①ビューファイルへの記述

new.html.haml

.chat-group-form
%h1 新規チャットグループ
= form_for @group do |f|
- if @group.errors.any?
.chat-group-form__errors
%h2= "#{@group.errors.full_messages.count}件のエラーが発生しました。"
%ul
- @group.errors.full_messages.each do |message|
-binding.pry
%li= message
.chat-group-form__field
.chat-group-form__field--left
= f.label :name, "グループ名", class: "chat-group-form__label"
.chat-group-form__field--right
=f.text_field :name, class: "chat__group_name chat-group-form__input", placeholder: "グループ名を入力してください"
.chat-group-form__field
.chat-group-form__field
.chat-group-form__field--left
= f.label :user, "チャットメンバー", class: "chat-group-form__label"
.chat-group-form__field--right
= f.collection_check_boxes :user_ids, User.all, :id, :name

 

%li = messageの部分に、errorsで取得した複数のエラーメッセージをeachで順に代入し、その結果として表示させたいので、

変数の直前に-binding.pryを記述

 

②ビューファイルの読み込み

続いて、new.html.hamlを表示させる。

ここでは、ページは止まらず表示されます。

 

あれ??ファイルの途中にbinding.pryを記述したのに、なんでしっかりページが表示されちゃうの??

 

-binding.pryを書いたのはエラー表示に関わるエリアであり、

このエリアは、グループ名をブランクにして登録ボタンをおすという条件(if文)が揃った時に初めて認識されるので、

登録ボタンをおす前段階の、ページ表示段階では、認識されません。

ゆえにスルーされるのです。

 

③グループ名が空のまま登録ボタンを押す。

これにより、エラーに関するコードが起動する条件を満たしたので、結果、-binding.pryも読み込まれ、ページの表示処理が途中で止まります。

 

④コンソール内で、変数messageに格納された値を確認

止めたので、あとは中身を確認していきます。

 

確認作業は、ターミナルのコンソールに移動して行います。

コンソールにて、変数messageを入力すると、格納しているメッセージが表示されるわけです。

 

[3] pry(#<#<Class:0x00007fe24fb1e548>>)> message

=> "Nameを入力してください"