窓際BLOG

プログラミングの学習メモや書籍の感想等を公開していきます。

RubyonRails:deviseのcurrent_userの返り値をカスタマイズする

deviseのヘルパーメソッドcurrent_userの返り値がデフォルトだとnilになるが、 空のUserインスタンスを返したかったけどハマったので、やり方をメモφ(..)

やり方

application_controller.rbcurrent_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インスタンスが設定されていると不正にログインされているように判定されてしまっているように思えた。。。

そのため、controllercurrent_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

参考

codenote.net