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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

1回答

979閲覧

Rails6.0 ログインできない

takumi1990

総合スコア0

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2020/10/25 14:23

編集2020/10/25 15:09

前提・実現したいこと

railsでログイン機能を実装したいです。
railsチュートリアルの8章を参考にして作ったのですが、
メールアドレス、パスワードを入力して「ログイン」ボタンを押してもログインできず、
ログインフォーム画面に戻されてしまいます。

※会員登録したときは登録ユーザーでログインできています。

以下関係がありそうなコードです。
ご回答いただけると幸いです。よろしくお願いいたします。

発生している問題・エラーメッセージ

特にエラーらしきものは出ないのですが、ログインボタンを押すとターミナルには以下のように表示されます。

Started GET "/login?authenticity_token=(略)&session%5Bemail%5D=(略)&session%5Bpassword%5D=[FILTERED]&commit=Log+in" (0.1ms) SELECT sqlite_version(*) Processing by SessionsController#new as HTML Parameters: {"authenticity_token"=>"(略)", "session"=>{"email"=>"(略)", "password"=>"[FILTERED]"}, "commit"=>"Log in"} Rendering sessions/new.html.erb within layouts/application Rendered sessions/new.html.erb within layouts/application (Duration: 0.8ms | Allocations: 445) [Webpacker] Everything's up-to-date. Nothing to do Rendered layouts/_shim.html.erb (Duration: 0.0ms | Allocations: 6) Rendered layouts/_header.html.erb (Duration: 0.1ms | Allocations: 38) Completed 200 OK in 10ms (Views: 9.6ms | ActiveRecord: 0.0ms | Allocations: 6146)

個人的には1行目の「Started GET」というところが気になっています。
ログインなのでPOSTで送られるはずなのになぜかGETで送られています。

該当のソースコード

sessions_controller.rb

Ruby

1class SessionsController < ApplicationController 2 3 def new 4 end 5 6 def create 7 user = User.find_by(email: params[:session][:email].downcase) 8 9 if user && user.authenticate(params[:session][:password]) 10 log_in user 11 redirect_to user 12 else 13 flash.now[:danger] = 'Invalid email/password combination' 14 render 'new' 15 end 16 end 17 18 def destroy 19 log_out 20 redirect_to root_url 21 end 22 23end 24

sessions_helper.rb

Ruby

1module SessionsHelper 2 3 # 渡されたユーザーでログインする 4 def log_in(user) 5 session[:user_id] = user.id 6 end 7 8 # 現在ログイン中のユーザーを返す (いる場合) 9 def current_user 10 if session[:user_id] 11 @current_user ||= User.find_by(id: session[:user_id]) 12 end 13 end 14 15 # ユーザーがログインしていればtrue、その他ならfalseを返す 16 def logged_in? 17 !current_user.nil? 18 end 19 20 # 現在のユーザーをログアウトする 21 def log_out 22 session.delete(:user_id) 23 @current_user = nil 24 end 25 26end

user.rb

Ruby

1class User < ApplicationRecord 2 3 before_save { self.email = email.downcase } 4 5 validates :name, presence: true, length: { maximum: 50 } 6 7 VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+.[a-z]+\z/i 8 validates :email, presence: true, length: { maximum: 255 }, 9 format: { with: VALID_EMAIL_REGEX }, 10 uniqueness: { case_sensitive: false } 11 12 has_secure_password 13 validates :password, presence: true, length: { minimum: 8 } 14 15 # 渡された文字列のハッシュ値を返す 16 def User.digest(string) 17 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 18 BCrypt::Engine.cost 19 BCrypt::Password.create(string, cost: cost) 20 end 21end 22

routes.rb

Ruby

1Rails.application.routes.draw do 2 3 root 'static_pages#index' 4 5 get '/signup', to: 'users#new' 6 post '/signup', to: 'users#create' 7 get '/login', to: 'sessions#new' 8 post '/login', to: 'sessions#create' 9 delete '/logout', to: 'sessions#destroy' 10 11 resources :users 12 13end

new.html.erb

HTML

1<div class="container-fluid"> 2 3<form class="form-signin"> 4 <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1> 5 6 <% flash.each do |message_type, message| %> 7 <div class="alert alert-<%= message_type %>"><%= message %></div> 8 <% end %> 9 10 <%= form_with(url: login_path, scope: :session, local: true) do |f| %> 11 <%= f.label :email %> 12 <%= f.email_field :email, class: 'form-control' %> 13 <%= f.label :password %> 14 <%= f.password_field :password, class: 'form-control' %> 15 16 <hr class="mb-4"> 17 18 <%= f.submit "Log in", class: "btn btn-lg btn-primary btn-block" %> 19 <% end %> 20 21 <p>New user? <%= link_to "Sign up now!", signup_path %></p> 22 23</form> 24 25</div>

試したこと

pry-byebugを用いてsessions_controller.rbの
create内にbinding.pryを入れてみましたが、反応しませんでした。
そもそもコントローラーがパラメータを受け取れていないのではないかと思っています。
試しに適当なメールアドレスやパスワードを入力しても「パスワードが間違ってる」などのエラーではなく、
全て同じ挙動になります(上記のようなターミナルの表示になる)。

補足情報(FW/ツールのバージョンなど)

<環境>
cloud9

<バージョン>
Rails 6.0.3.4
ruby 2.6.3

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

自己解決できました。

原因はnew.html.erbでした。
bootstrapのテンプレートを改修して作ったのですが、
その際にformタグを消すのを忘れていました。

※フォームタグが2個ある状態になってました、、、

html

1<form class="form-signin"> 2 <h1 class="h3 mb-3 font-weight-normal">Please sign in</h1> 3 4 <% flash.each do |message_type, message| %> 5 <div class="alert alert-<%= message_type %>"><%= message %></div> 6 <% end %> 7 8 <%= form_with(url: login_path, scope: :session, local: true) do |f| %>

投稿2020/10/26 07:24

takumi1990

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問