前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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を使ってデバッグするとわかりやすいかと
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
コントローラの11行目
>User.find_by(email: params[:email])
ここ、 user_params[:email]
じゃないですか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
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
です。