deviseのヘルパーメソッドcurrent_user
の返り値がデフォルトだとnil
になるが、
空のUser
インスタンスを返したかったけどハマったので、やり方をメモφ(..)
やり方
application_controller.rb
でcurrent_user
をoverrideする。
しかし、alias_method :devise_current_user, :current_user
で、aliasを記載する必要があるため注意。
class ApplicationController < ActionController::Base alias_method :devise_current_user, :current_user def current_user if devise_current_user.nil? User.new else User.find_by_id(devise_current_user.id) end end end
しかし
一旦上記手順でやろうとしたが、このやり方だとuser_signed_in?
等が上手く動かない等の問題が発生してしまいました。。。
※current_userがnilかどうかでログイン状態を判定しているため、未ログイン時に空のUserインスタンスが設定されていると不正にログインされているように判定されてしまっているように思えた。。。
そのため、controller
でcurrent_user
をインスタンス変数に格納し、それをnull判定して空のインスタンスを設定してViewでもそれを参照するようにした。
DBアクセスも減るし、ライブラリとの依存も減る気がするので、なかなか良いんじゃないかと思いました。
class PagesController < ApplicationController before_action :set_user def index # ログイン有無により処理を分岐 if !@user.id.nil? @pages = Page.favorited_pages(current_user).page(params[:page]) @favorites = Favorite.find_by(user_id: current_user.id) else @pages = Page.all.order('updated_at DESC').page(params[:page]) end end private def set_user # current_userがnilだったら空のUserインスタンスを設定 @user = current_user || User.new end end