0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsでアバター画像が設定されていないときにプロフィール編集ページにリダイレクトする設定方法

Posted at

やりたいこと

ユーザー登録後、プロフィール画像を登録していない場合にはプロフィール設定のページに遷移したい
※抽象化すると、特定の条件を満たすとき、特定のページに遷移させたい

前提

  • Railsを使用
  • User has_one Profile の関係
  • ユーザーがSign upしたタイミングではprofileはつくられない

課題

  • プロフィールは自動で生成されないため、unless current_user.profile.avatar.attached?のような条件文だと、.nilクラスのエラーが出る
  • application_controllerにプロフィール編集画面へのリダイレクトを記載すると、リダイレクトが繰り返されしまう

解決策

条件文の記載方法

application_controllerに以下を記載。

  before_action :check_avatar
  
  private
  def check_avatar
    if user_signed_in?
      unless current_user.profile.present?
        redirect_to profile_path, notice: 'アバター画像を設定してください。'
        return
      end

      unless current_user.profile.avatar.present?
        redirect_to profile_path, notice: 'アバター画像を設定してください。'
      end
    end
  end

処理を以下の2つに分岐することで回避しました。

  • プロフィールがない場合
  • プロフィールはあるが、アバター画像の設定がされていない場合

ちなみに、ログインしていない場合については別途規定しています。

リダイレクトの回避

原因

先述の設定を、すべてのControllerの継承元のapplication_controllerに記述しているため、当然profiles_controllerにも設定が反映されてしまう。
故に、プロフィールがない場合orアバターがない場合、プロフィール編集ページにリダイレクトされ、プロフィール編集ページからプロフィール編集ページにリダイレクトされ…という処理になってしまう

回避方法

profile_controllerに以下を記述

  skip_before_action :check_avatar, only: [:edit, :show, :update]

学びになったこと

  • 地味にunlessやreturnの使い方をちゃんと理解できていなかったので文法の基礎的な部分の穴埋めになった
  • skip_before_actionというメソッドを知った
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?