1
0

More than 3 years have passed since last update.

【プログラミング初心者】binding.pryを使用したログイン画面のデバッグ方法

Posted at

記事を書く目的

プログラミングを勉強中です。
エラーで詰まることばかりの為、自分でしっかりとデバッグができるようになりたいと考え、備忘録としてデバッグを行った際の記事を残します。

環境

Mac OS catalina 10.15.3
Rails 5.2.4.1
Visual Studio Code

状況

Railsを用いてアプリケーションを開発中、ログインができないというエラーが発生しました。
(deviseを使わず実装しています)
何が問題なのか突き止めるべく、binding.pryを使ってみます。

デバッグの手順

①gem 'pry-rails'をインストール(binding.pryを使うためのgemです)

Gemfile

gem 'pry-rails', group: :development

これをファイルの一番下に追記

デバッグは開発環境でしか使わないのでgroup: :developmentを記載しています。

Gemfile
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を入れ込む

今回は、ログインができないというバグが起こっています。
ログイン時には、ユーザーのメールアドレスとパスワードを入力します。
デバッグを行うことで、ログインしている情報が誤っているのか、正確に情報がコントローラに伝わっていないのか、どこに問題があるのかを切り分けることができます。

sessions_contoroller.rb
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というコードが読み込まれた時点で処理を止めるので、「ログイン」など押すことができなくなります。

④処理が止まっている状態でターミナルを開く

terminal
  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を修正する

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に基づくシンプルなデバッグでしたが、
コードが複雑になったもしっかり応用できるようにしたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0