やりたいこと
ユーザー登録後、プロフィール画像を登録していない場合にはプロフィール設定のページに遷移したい
※抽象化すると、特定の条件を満たすとき、特定のページに遷移させたい
前提
- 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というメソッドを知った