前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。