質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.37%

Rails ログインできない

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 533

14j126

score 9

前提・実現したいこと

Railsでログインページを作り、ログインしようとしたのですが、登録できたメールアドレス、パスワードを入力しても「ログインに失敗しました」と表示され、ログインできません。
どうすればログインができるようになるのでしょうか?(ユーザー登録はできています)

BCyrptのgemを使って作成しています。

以下関係がありそうなコードです。

ご回答いただけると幸いです。よろしくお願いいたします。

該当のソースコード

users_controller.erb

class UsersController < ApplicationController

  before_action :authorize, except: [:new, :create, :sign_in, :sign_in_process]

  def sign_in
    @user = User.new
    render layout: "not_login"
  end

  def sign_in_process
    user = User.find_by(email: params[:email])
    if user && user.authenticate(params[:password])
      user_sign_in(user)
      flash[:success] = 'ログインしました'
      redirect_to products_path
    else
      flash[:danger] = 'ログインに失敗しました'
      redirect_to sign_in_path
    end
  end

  private
  def user_params
    params.require(:user).permit(:name,:email,:password)
  end
end

users.rb

class User < ApplicationRecord
  has_secure_password

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, uniqueness: true, format:{ with: VALID_EMAIL_REGEX }
  validates :password, presence: true, length:{minimum: 8}
end

sign_in.html.erb

<h3>ログイン</h3>
  <%= form_for @user, url: sign_in_path do |f| %>
    <div class="field">
      <%= f.email_field :email, placeholder: "メールアドレス" %>
    </div>
    <div class="field">
      <%= f.password_field :password, placeholder: "パスワード" %>
    </div>
    <div class="actions">
      <%= f.submit "ログイン" %>
    </div>
  <% end %>

  <div class="sign_in_link">
    <p>アカウントをお持ちですか? <%= link_to users_new_path do %>新規登録する<% end %></p>
  </div>


users_helper.rb

module UsersHelper

  def user_sign_in(user)
    session[:user_id] = user.id
  end

  def current_user
    if @current_user.nil?
       @current_user = User.find_by(id: session[:user_id])
    else
       @current_user
    end
  end

  def user_signed_in?
   current_user.present?
  end

  def authorize
   redirect_to sign_in_path unless user_signed_in?
  end

end


routes.rb

Rails.application.routes.draw do
  resources :users, only: [:edit, :update]
  get '/sign_in', to:'users#sign_in', as: :sign_in
  post '/sign_in', to: 'users#sign_in_process'
end

試したこと

Userテーブルを作り直したり、サーバーを再起動させましたが特に変化はありませんでした。
DBはSQLiteを使っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2020/10/09 18:56

    >ログインできません。
    何が起きるのでしょう。
    https://teratail.com/help/question-tips#questionTips3-4

    キャンセル

  • 14j126

    2020/10/09 22:28

    言葉足らずで申し訳ございません。登録されたメールアドレス、パスワードでログインしても「ログインに失敗しました」と表示され、ログインができない状態になります。

    キャンセル

  • winterboum

    2020/10/28 10:15

    model Userのschemaを見せてください

    キャンセル

  • 14j126

    2020/10/28 16:06

    ActiveRecord::Schema.define(version: 2020_10_06_172459) do

    create_table "users", force: :cascade do |t|
    t.string "name"
    t.string "email"
    t.string "password_digest"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    end

    end
    です。

    キャンセル

回答 4

check解決した方法

0

def sign_in_process
user = User.find_by(email: params[:user][:email])
if user && user.authenticate(params[:user][:password])
user_sign_in(user)
flash[:success] = 'ログインしました'
redirect_to products_path and return
else
flash[:danger] = 'ログインに失敗しました'
redirect_to sign_in_path
end
end

paramsの前に[:user]を置いたところでログインできました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

たぶんparamsの使い方のあたりかなという気がします

とりあえず失敗したときのログを見てみましょう!(ターミナルに表示される文字)

もしくはpryを使ってデバッグするとわかりやすいかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/12 01:39

    pry-byebugをインストールして行いました。

    キャンセル

  • 2020/10/12 11:39

    デバッグで何を確認したのか書いてください

    キャンセル

  • 2020/10/24 17:56

    返信が遅くなり、申し訳ございません。
    pry-byebugを利用し、paramsを確認すると、
    <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"長いので省略==", "user"=>{"email"=>"登録したメールアドレス", "password"=>"登録したパスワード"}, "commit"=>"ログイン", "controller"=>"users", "action"=>"sign_in_process"} permitted: false>
    と表示されます。

    キャンセル

0

コントローラの11行目
>User.find_by(email: params[:email])
ここ、 user_params[:email] じゃないですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/24 18:03

    user_params[:email]にしてみたのですが、
    SQLite3::SQLException: near "~~": syntax error: SELECT "users".* FROM "users" WHERE (登録したメールアドレス) LIMIT ? と表示されます…
    DBはSQLiteを使っています。

    キャンセル

0

def sign_in_process
user = User.find_by(email: params[:user][:email])
if user && user.authenticate(params[:user][:password])
user_sign_in(user)
flash[:success] = 'ログインしました'
redirect_to products_path and return
else
flash[:danger] = 'ログインに失敗しました'
redirect_to sign_in_path
end
end

paramsの前に[:user]を置いたところでログインできました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る