#解決したいこと
RailsでWebアプリケーションを作成しています。
deviseを使ってユーザー認証機能をつけていますが、
後からこちらを参考にLocal
という別のモデルをdeviseを使って作成した後、
User
モデルのcurrent_user
がうまく機能しなくなってしまいました。
(Local
モデルのcurrent_local
は通常通り機能しています)
なお、User
モデル自体は一度deviseを使わずにRailsチュートリアルに添いながら作成し、
後からこちらの記事を参考にdeviseを使ったものに作り替えています。
このことが原因なのかなと思いつつ、コードを見返しても原因の箇所が見つけられません。
#環境
ローカル環境にて開発中です。
各バージョンは下記の通りです。
バージョン | |
---|---|
OS | macOS Big Sur 11.3 |
Ruby | 3.0.0 |
Ruby on Rails | 6.1.3.1 |
devise | 4.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
を使いたい場面でもやはりうまく機能しないため、
本質的には解決できていないという現状です。
確認すべきファイルやコードなど、何かヒントだけでもお力添え頂けますと幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。