🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

ログイン

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

Q&A

解決済

3回答

608閲覧

RubyonRails ログイン機能 ログインできない

kmkr

総合スコア6

Ruby on Rails

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

ログイン

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

0グッド

0クリップ

投稿2021/02/26 02:44

前提・実現したいこと

こちらのサイトを参考にログイン機能を作成していました。

ログインした後にposts_pathに遷移したいのですが、login_pathのままです。
恐らく単にログインができてないだけだと思うのですが原因が分かりません。

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

エラーは出ていません。

該当のソースコード

cotrollers/application_controller.rb

Ruby

1class ApplicationController < ActionController::Base 2 include SessionsHelper 3 4 protect_from_forgery 5 private 6 # ログイン済みユーザーかどうか確認 7 def logged_in_user 8 unless logged_in? 9 redirect_to login_url 10 end 11 end 12end

controllers/sessons_controller.rb

class SessionsController < ApplicationController def new end def create user = User.find_by(email: params[:session][:email].downcase) if user && user.authenticate(params[:session][:password]) log_in user redirect_to posts_path else redirect_to login_path end end def destroy log_out if logged_in? redirect_to posts_path end end

routes.rb

Rails.application.routes.draw do get '/login', to: 'sessions#new' post '/login', to: 'sessions#create' delete '/logout', to: 'sessions#destroy' resources :posts end

helpers/sessions_helper.rb

module SessionsHelper # 渡されたユーザーでログインする def log_in(user) session[:user_id] = user.id end def current_user if session[:user_id] #@current_user = @current_user || User.find_by(id: session[:user_id])と同じ意味 @current_user ||= User.find_by(id: session[:user_id]) end end #受け取ったユーザーがログイン中のユーザーと一致すればtrueを返す def current_user?(user) user == current_user end # ユーザーがログインしていればtrue、その他ならfalseを返す def logged_in? !current_user.nil? end # 現在のユーザーをログアウトする def log_out session.delete(:user_id) @current_user = nil end end

試したこと

DBの中身を見ましたがしっかりと入ってました。
イメージ説明

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

<form>を<form method="POST">としても正常に動作しました。

form タグを消すのが正しいやり方です!

(私の回答で混乱させてしまったようですみません)

自分で form タグを書かなくても、Rails の form_for メソッドが自動で <form method="POST"> を生成してくれます。

投稿2021/02/26 09:40

shinoharat2

総合スコア73

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

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

kmkr

2021/02/26 10:08

なるほど!修正しておきます!
guest

0

ログインボタンを押した時、GETでリクエストが発生しているため、createではなくnewアクションが呼ばれている状態です。

恐らく app/views/sessions.new.html.erb に問題があります。
form の method が GET になっていませんか?

投稿2021/02/26 09:17

shinoharat2

総合スコア73

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

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

kmkr

2021/02/26 09:22

回答ありがとうございます。 つい先ほどこの問題が解決したので解決方法を書きました。 それを踏まえるとformタグがGETリクエストにしているということなのでしょうか?
kmkr

2021/02/26 09:26

なるほど。今formタグについて調べました。formタグはmethodを指定しないと自動的にGETになるみたいですね。改めて回答していただきありがとうございました。とてもスッキリしました
guest

0

自己解決

解決しました。

上記に乗せたソースコードは全く関係がなく、sessions/new.html.erbに問題がありました。sessions/new.html.erbの中にあるformタグを消したところうまくログインができました。
ただ、なぜformタグがあると正常に動作しなかったのかは分かりません。
~~ー>formタグはmethodを指定しないと自動的にGETになる。そのため、formタグを消してもよかったのですが

<form>を<form method="POST">としても正常に動作しました~~ 結論、<form>タグはいらない 理由:form_for()が自動で<form method="POST">を生成してくれるためコードが冗長になってしまう。

解決前のコード

<head> </head> <body class="text-center"> <main class="form-signin"> <form> <h1 class="h3 mb-3 fw-normal">Sign in</h1> <%= form_for(:session, url: login_path) do |f| %> <%= f.label :email ,class:"visually-hidden"%> <%= f.email_field :email ,type:"email" ,class:"form-control" ,placeholder:"Email address" %> <%= f.label :password ,class:"visually-hidden"%> <%= f.password_field :password ,type:"password" ,class:"form-control" ,placeholder:"Password" %> <%= f.submit "Log in" ,class:"w-100 btn btn-lg btn-primary"%> <% end %> </form> </main> </body>

解決後のコード

<head> </head> <body class="text-center"> <main class="form-signin"> <h1 class="h3 mb-3 fw-normal">Sign in</h1> <%= form_for(:session, url: login_path) do |f| %> <%= f.label :email ,class:"visually-hidden"%> <%= f.email_field :email ,type:"email" ,class:"form-control" ,placeholder:"Email address" %> <%= f.label :password ,class:"visually-hidden"%> <%= f.password_field :password ,type:"password" ,class:"form-control" ,placeholder:"Password" %> <%= f.submit "Log in" ,class:"w-100 btn btn-lg btn-primary"%> <% end %> </main> </body>

投稿2021/02/26 09:15

編集2021/02/26 10:12
kmkr

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問