質問: 0 errors[:user_auth] << I18n.t('validate.not_auth_user') end else errors[:user_auth] << I18n.t('validate.not_auth_user') end ``` Userモデルとは別でUserAuthという認証情報を管理しているモデルがあり、 UserAuthはユーザが認証を申請するとレコードが作成され、管理者側でその申請を承認すると user_auth.statusは0から1に切り替わります。 上記のバリデーションで、ユーザ認証が済んでいないユーザに対してバリデーションをかけています。 ifのネストが深い点、errorsの追加の行が二つ存在する点が可読性を損ねている気がしているのですが、 もっといい書き方がありましたら、ご教示いただければ嬉しいです。 よろしくお願いいたします。
回答: もしかしたら、このように書けるのではないでしょうか ``` user_auth = UserAuth.find_by(user_id: user.id) # self は省略可 # user_auth がnil ならnil を返す # user_auth がnil でなければメソッドを呼び出し判定処理をする errors[:user_auth] << I18n.t('validate.not_auth_user') unless user_auth&.status&.eql?(1) return if errors.any? # エラーがないので処理を続行 # ... ``` この、「ユーザが認証済みか否かを判定する処理」をメソッドに切り出すこともできるかもしれません ``` errors[:user_auth] << I18n.t('validate.not_auth_user') unless user_already_authorized? return if errors.any? #... AUTHORIZED_USER = 1 # ※UserAuth クラス内で定義 UNAUTHORIZED_USER = 0 # ※UserAuth クラス内で定義 def user_already_authorized? user_auth = UserAuth.find_by_user_id(user.id) user_auth&.status&.eql?(UserAuth::AUTHORIZED_USER) end ``` エラーがあった場合にする処理、そうでない場合の処理、とメソッド内で上下に2分することができれば、ネストの浅いコードを書くことができると思います 以上、何か参考になれば幸いです Links ====== * Ruby 2.3.0 リリース (Safe Navigation Operator についての記述) * Ruby on Rails API