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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Devise

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

Ruby on Rails

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

Q&A

解決済

1回答

1247閲覧

[Rails]deviseで認証機能をつけたUserモデルのcurrent_userが機能しなくなってしまいました

Kahoo

総合スコア14

Devise

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/06/02 05:38

#解決したいこと
RailsでWebアプリケーションを作成しています。
deviseを使ってユーザー認証機能をつけていますが、
後からこちらを参考にLocalという別のモデルをdeviseを使って作成した後、
Userモデルのcurrent_userがうまく機能しなくなってしまいました。
Localモデルのcurrent_localは通常通り機能しています)

なお、Userモデル自体は一度deviseを使わずにRailsチュートリアルに添いながら作成し、
後からこちらの記事を参考にdeviseを使ったものに作り替えています。
このことが原因なのかなと思いつつ、コードを見返しても原因の箇所が見つけられません。

#環境

ローカル環境にて開発中です。
各バージョンは下記の通りです。

バージョン
OSmacOS Big Sur 11.3
Ruby3.0.0
Ruby on Rails6.1.3.1
devise4.7.3

そのほか、お伝えすべき情報がございましたらお手数ですがご教示ください。

#問題の箇所の具体的例
【ヘッダーのパーシャル views/layout/_header.html.erb】

Ruby

1 <nav> 2 <ul class="nav navbar-nav navbar-right"> 3 <% if user_signed_in? %> 4 <li><%= link_to "検索", '#' %></li> 5 <li><%= link_to "タイムライン", '#' %></li> 6 <li><%= link_to "メッセージ", '#' %></li> 7 <li><%= link_to "通知", '#' %></li> 8 <li class="dropdown"> 9 <a href="#" class="dropdown-toggle" data-toggle="dropdown"> 10 <%= gravatar_for @user, size: 30 %> 11 </a> 12 <ul class="dropdown-menu"> 13 <li><%= link_to "プロフィール", user_path(current_user) %></li> 14 <li><%= link_to "プロフィール編集", edit_user_registration_path %></li> 15 <li><%= link_to "ブックマーク", "#" %></li> 16 <li class="divider"></li> 17 <li> 18 <%= link_to "ログアウト", destroy_user_session_path, method: :delete %> 19 </li> 20 </ul> 21 </li> 22 <% elsif local_signed_in? %> 23 <li><%= link_to 'マイページ', current_local %></li> 24 <li><%= link_to "メッセージ", '#' %></li> 25 <li><%= link_to "通知", '#' %></li> 26 <li><%= link_to 'ログアウト', destroy_local_session_path, method: :delete %> 27 <% else %> 28 <li><%= link_to "ログイン", new_user_session_path %></li> 29 <li><%= link_to "自治体の方はこちら", new_local_session_path %></li> 30 <% end %> 31 </ul> 32 </nav>

【コントローラー app/controllers/users_controller.rb】

class UsersController < ApplicationController skip_before_action :authenticate_user!, if: :local_signed_in? skip_before_action :authenticate_local!, if: :user_signed_in? def show @user = current_user end end

【ルーティング config/routes.rb】

Rails.application.routes.draw do devise_for :locals, controllers: { sessions: 'locals/sessions', passwords: 'locals/passwords', registrations: 'locals/registrations', confirmations: 'locals/confirmations' } get 'locals/:id', to: 'locals#show', as: 'local' devise_for :users, controllers: { omniauth_callbacks: 'users/omniauth_callbacks', registrations: "users/registrations", confirmations: 'users/confirmations' } get 'users/:id', to: 'users#show', as: 'user' ...略 end

user_sign_in?ではログイン済みと判定されているようで、ログイン後のナビゲーションを表示しようとするのですが、
current_userが機能していないために、下記エラーが発生します。

ActionView::Template::Error (No route matches {:action=>"show", :controller=>"users", :id=>nil}, missing required keys: [:id]): 13: <%= gravatar_for @user, size: 30 %> 14: </a> 15: <ul class="dropdown-menu"> 16: <li><%= link_to "プロフィール", user_path(current_user) %></li> 17: <li><%= link_to "プロフィール編集", edit_user_registration_path %></li> 18: <li><%= link_to "ブックマーク", "#" %></li> 19: <li class="divider"></li>

#自分で試したこと
ルーティングを下記に変更し

get '/user', to: 'users#show', as: 'user'

コントローラーを

def show @user = current_user end

ビューを

<li><%= link_to "プロフィール", user_path %></li>

とすると、期待通り、現在ログインしているユーザーの情報が載ったページが表示されます。

ただし、この状態でapp/views/users/show.html.erbの中に
<%= puts current_user %>とするとエラーは出ませんが期待した箇所になんの表示もされません。
また<%= puts current_user.name %>では、やはり

ActionView::Template::Error (undefined method `name' for nil:NilClass):

というエラーが出ます。

他でcurrent_userを使いたい場面でもやはりうまく機能しないため、
本質的には解決できていないという現状です。

確認すべきファイルやコードなど、何かヒントだけでもお力添え頂けますと幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

Userモデルを最初に作成した際の、自作のcurrent_userメソッドがapp/helpers/sessions_helper.rbに残っており、これが原因でした。
こちらを削除したところ、期待通りに機能しました。
お騒がせし失礼いたしました。

投稿2021/06/02 06:39

Kahoo

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問