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

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

詳細はこちら
Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

ログイン

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

Q&A

解決済

1回答

1559閲覧

deviseのログインフォームをログイン画面だけでなく、トップページにも実装したい

miyaengineer

総合スコア4

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Ruby on Rails

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

ログイン

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

0グッド

0クリップ

投稿2021/03/27 13:23

編集2021/03/27 15:43

前提・実現したいこと

プログラミング初学者です。この度初めてTeratailにて質問を投じさせていただきます。
何卒よろしくお願い申し上げます。

現在railsにてアプリを開発しております。
deviseを導入してユーザー管理機能を実装いたしました。
新規登録・ログインともに問題ありません。
そこでパスが/users/sign_inだけでなく、トップページ(ルートパス)にもログインのフォームを実装しようと思いました。
フォームの実装はできたのですが、登録されているユーザーのemail・passwordを入力しても、認証ができず、ログイン画面に遷移します。

トップページからでもログインできるようにしたいのですが、お力添え願えますでしょうか。

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

トップページからemail/passwordを入力してログインを試みたときのログ
Started POST "/users/sign_in" for 172.25.0.1 at 2021-03-27 13:06:46 +0000 Cannot render console from 172.25.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by Devise::SessionsController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "email"=>"test@test.com", "password"=>"[FILTERED]", "commit"=>"sign in"} Completed 401 Unauthorized in 1ms (Allocations: 363) Processing by Devise::SessionsController#new as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "email"=>"test@test.com", "password"=>"[FILTERED]", "commit"=>"sign in"} Rendering layout layouts/application.html.erb Rendering devise/sessions/new.html.erb within layouts/application Rendered shared/_second-header.html.erb (Duration: 8.3ms | Allocations: 641) Rendered shared/_second-footer.html.erb (Duration: 4.7ms | Allocations: 301) Rendered devise/sessions/new.html.erb within layouts/application (Duration: 15.5ms | Allocations: 1369) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 59.0ms | Allocations: 6430) Completed 200 OK in 62ms (Views: 61.0ms | Allocations: 6926)

追記 (3/28 0:40)

通常通りログイン画面からemail/passwordを入力してログインに成功した時のログ
Started POST "/users/sign_in" for 172.25.0.1 at 2021-03-27 15:39:20 +0000 Cannot render console from 172.25.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by Devise::SessionsController#create as HTML Parameters: {"authenticity_token"=>"[FILTERED]", "user"=>{"email"=>"test@test.com", "password"=>"[FILTERED]"}, "commit"=>"ログイン"} User Load (1.7ms) SELECT `users`.* FROM `users` WHERE `users`.`email` = 'test@test.com' ORDER BY `users`.`id` ASC LIMIT 1 Redirected to http://localhost:3000/ Completed 302 Found in 228ms (ActiveRecord: 1.7ms | Allocations: 3488) Started GET "/" for 172.25.0.1 at 2021-03-27 15:39:20 +0000 Cannot render console from 172.25.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by BikkesController#index as HTML Rendering layout layouts/application.html.erb Rendering bikkes/index.html.erb within layouts/application User Load (1.3ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ app/views/shared/_header.html.erb:6 Rendered shared/_header.html.erb (Duration: 15.3ms | Allocations: 1689) Rendered shared/_search-list.html.erb (Duration: 70.7ms | Allocations: 4675) Rendered shared/_footer.html.erb (Duration: 4.5ms | Allocations: 443) Rendered bikkes/index.html.erb within layouts/application (Duration: 93.6ms | Allocations: 7048) [Webpacker] Everything's up-to-date. Nothing to do Rendered layout layouts/application.html.erb (Duration: 137.9ms | Allocations: 11951) Completed 200 OK in 141ms (Views: 138.8ms | ActiveRecord: 1.3ms | Allocations: 12565)

該当のソースコード

ログイン画面のソースコード

ruby

1<%= form_with model: @user, url: user_session_path, class: 'registration-main', local: true do |f| %> 2<div class='form-wrap'> 3 <div class='form-header'> 4 <h1 class='form-header-text'> 5 ログイン 6 </h1> 7 </div> 8 <div class='login-flash-message'> 9 <%= flash[:notice] %> 10 <%= flash[:alert] %> 11 </div> 12 <div class="form-group"> 13 <div class='form-text-wrap'> 14 <label class="form-text">メールアドレス</label> 15 <span class="indispensable">必須</span> 16 </div> 17 <%= f.email_field :email, class:"input-default", id:"email", placeholder:"PC・携帯どちらでも可", autofocus: true %> 18 </div> 19 <div class="form-group"> 20 <div class='form-text-wrap'> 21 <label class="form-text">パスワード</label> 22 <span class="indispensable">必須</span> 23 </div> 24 <%= f.password_field :password, class:"input-default", id:"password", placeholder:"" %> 25 </div> 26 <div class='login-btn'> 27 <%= f.submit "ログイン" ,class:"login-red-btn" %> 28 </div> 29 <div class="info-text-signup"> 30 会員登録がまだの人は<span><%= link_to "こちら", new_user_registration_path %></span> 31 </div> 32</div> 33<% end %>
トップ画面でのログインフォーム

ruby

1 <% unless user_signed_in? %> 2 <%= form_with model: @user, url: user_session_path, class: 'top-session', local: true do |f| %> 3 <%= f.email_field :email, class:"top-input-signin", id:"email", placeholder:"email" %> 4 <%= f.password_field :password, class:"top-input-signin", id:"password", placeholder:"password" %> 5 <div class='top-signin-btn'> 6 <%= f.submit "sign in" ,class:"top-signin-white-btn" %> 7 </div> 8 <div class="top-info-text-signup"> 9 会員登録がまだの人は<span><%= link_to "こちら", new_user_registration_path %></span> 10 </div> 11 <% end %> 12 <% end %>

試したこと

・ログを見る限り、トップページのログインフォームからでも「deviseのSessionController#newアクション」は動いている様子。
→データベースにアクセスできていないということ?
・ログイン画面のフォームをトップページにコピペしたが、記述に誤りがないかの確認。
・「devise ログインフォーム トップページにも」といったキーワードで検索をかけるも有効な記事が見つからず。
deviseの公式Githubを確認。ログイン画面以外のページからのログイン遷移方法に関して有効な方法は見つからず。

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

各種バージョン

ruby : 2.6.5
rails : 6.1.3
docker : 20.10.5
mysql : 5.7

閲覧いただき誠にありがとうございます。
情報不足がございましたら、遠慮なくおっしゃってください。
何かヒントでもいただけたら幸いでございます。
お時間取らせてしまい恐縮ですが、よろしくお願いいたします。

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

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

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

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

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

winterboum

2021/03/27 14:42

paramsの構造が違うかもしれない。念の為、Deviceの画面からLoginした時とくらべてみて
miyaengineer

2021/03/27 15:45

winterboum様、ありがとうございます。 ログイン画面からログインした時のログを追記しました。 確かにparameterが違いますね。ありがとうございます。 これを元に自分でも調べてみたいと思います。
guest

回答1

0

ベストアンサー

Top画面に行く時、@user が未定義ではないですか?
@user = User.new
を入れてみてください。

投稿2021/03/27 23:56

winterboum

総合スコア23567

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

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

miyaengineer

2021/03/28 06:50

ありがとうございます。 メインのコントローラーにおける indexアクションに上記を定義したところ解決いたしました。 deviseのコントローラーが働いているから大丈夫だと思っていたのですが、やはりちゃんとトップページで動くコントローラにもインスタンス変数を定義しなければならないのですね。 大変勉強になりました。 ご協力いただき本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問