##記事を書く目的
プログラミングを勉強中です。
エラーで詰まることばかりの為、自分でしっかりとデバッグができるようになりたいと考え、備忘録としてデバッグを行った際の記事を残します。
##環境
Mac OS catalina 10.15.3
Rails 5.2.4.1
Visual Studio Code
##状況
Railsを用いてアプリケーションを開発中、ログインができないというエラーが発生しました。
(deviseを使わず実装しています)
何が問題なのか突き止めるべく、binding.pryを使ってみます。
##デバッグの手順
###①gem 'pry-rails'をインストール(binding.pryを使うためのgemです)
gem 'pry-rails', group: :development
↑
これをファイルの一番下に追記
デバッグは開発環境でしか使わないのでgroup: :developmentを記載しています。
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'pry-rails', group: :development
↑
group :development doの中に記載
するのでも問題ないです。
###②ターミナルでbundle installを行う
pry-railsが読み込まれ、実際に使用することができるようになります。
###③実際に、調べたいコードの中にbinding.pryを入れ込む
今回は、ログインができないというバグが起こっています。
ログイン時には、ユーザーのメールアドレスとパスワードを入力します。
デバッグを行うことで、ログインしている情報が誤っているのか、正確に情報がコントローラに伝わっていないのか、どこに問題があるのかを切り分けることができます。
def create
company = Company.find_by(email: session_params[:email])
if company && company.authenticate(session_params[:password])
session[:company_id] = company.id
→ binding.pry(コードの途中に記載します)
redirect_to root_path,notice: 'ログインに成功しました'
else
render :new
end
end
binding.pryというコードが読み込まれた時点で処理を止めるので、「ログイン」など押すことができなくなります。
###④処理が止まっている状態でターミナルを開く
Company Load (0.6ms) SELECT "companies".* FROM "companies" WHERE "companies"."email" = ? LIMIT ? [["email", "foobar@example.com"], ["LIMIT", 1]]
↳ app/controllers/sessions_controller.rb:9
Unpermitted parameter: :password
↑この文章に注目
Rendering sessions/new.html.erb within layouts/application
Rendered sessions/new.html.erb within layouts/application (3.4ms)
Rendered partial/_navbar.html.erb (1.7ms)
Rendered partial/_footer.html.erb (1.1ms)
Completed 200 OK in 450ms (Views: 168.0ms | ActiveRecord: 1.5ms)
```
ターミナルを開くと、エラー文が表示されています。
Unpermitted parameter: :passwordは直訳すると
「password入力画面があるけど、passwordはパラメーターとして許可されていません」という意味になります。
→ここで初めて、passwordを情報として入力する許可(permit)を忘れていたことがわかりました!
###⑤sessions.controllerのsession_paramsを修正する
```ruby:sessions.controller.rb
修正前
private
def session_params
params.require(:session).permit(:name,:email)
end
修正後
private
def session_params
params.require(:session).permit(:name,:email,:password)
end
```
これで:passwordがパラメーターで弾かれず、コントローラに情報が渡る様になったため、
無事にログインができる様になりました!!!
##学んだこと
binding.pryを用いれば、簡単にデバッグができる。
エラーが出ると焦ってしまいますが、エラー文やコードに、エラー解決へのヒントは記載されている
今回はsession_paramsに基づくシンプルなデバッグでしたが、
コードが複雑になったもしっかり応用できるようにしたいと思います。