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

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

ただいまの
回答率

87.58%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 621

score 4

前提・実現したいこと

プログラミング初学者です。この度初めて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)

該当のソースコード

ログイン画面のソースコード
<%= form_with model: @user, url: user_session_path, class: 'registration-main', local: true do |f| %>
<div class='form-wrap'>
  <div class='form-header'>
    <h1 class='form-header-text'>
      ログイン
    </h1>
  </div>
  <div class='login-flash-message'>
    <%= flash[:notice] %>
    <%= flash[:alert] %>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">メールアドレス</label>
      <span class="indispensable">必須</span>
    </div>
    <%= f.email_field :email, class:"input-default", id:"email", placeholder:"PC・携帯どちらでも可", autofocus: true %>
  </div>
  <div class="form-group">
    <div class='form-text-wrap'>
      <label class="form-text">パスワード</label>
      <span class="indispensable">必須</span>
    </div>
    <%= f.password_field :password, class:"input-default", id:"password", placeholder:"" %>
  </div>
  <div class='login-btn'>
    <%= f.submit "ログイン" ,class:"login-red-btn" %>
  </div>
  <div class="info-text-signup">
    会員登録がまだの人は<span><%= link_to "こちら", new_user_registration_path %></span>
  </div>
</div>
<% end %>
トップ画面でのログインフォーム
    <% unless user_signed_in? %>
      <%= form_with model: @user, url: user_session_path, class: 'top-session', local: true do |f| %>
        <%= f.email_field :email, class:"top-input-signin", id:"email", placeholder:"email" %>
        <%= f.password_field :password, class:"top-input-signin", id:"password", placeholder:"password" %>
        <div class='top-signin-btn'>
          <%= f.submit "sign in" ,class:"top-signin-white-btn" %>
        </div>
        <div class="top-info-text-signup">
          会員登録がまだの人は<span><%= link_to "こちら", new_user_registration_path %></span>
        </div>
      <% end %>
    <% end %>

試したこと

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

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

各種バージョン

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • winterboum

    2021/03/27 23:42

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

    キャンセル

  • miyaengineer

    2021/03/28 00:45

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

    キャンセル

回答 1

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/03/28 15:50

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

    キャンセル

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

  • ただいまの回答率 87.58%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る