質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

2129閲覧

条件分岐の最適化がしたい

azuno_mix

総合スコア71

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2016/11/29 10:52

編集2016/11/29 10:57

if文のもっと良い書き方

現在、Railsでバリデーションメソッドを実装しているのですが、
我ながら書いていて「これってイケてないのは・・・?」というコードを書いています。

rb

1user_auth = UserAuth.find_by(user_id: self.user.id) 2if user_auth.present? 3 if user_auth.status == 0 4 errors[:user_auth] << I18n.t('validate.not_auth_user') 5 end 6else 7 errors[:user_auth] << I18n.t('validate.not_auth_user') 8end

Userモデルとは別でUserAuthという認証情報を管理しているモデルがあり、
UserAuthはユーザが認証を申請するとレコードが作成され、管理者側でその申請を承認すると
user_auth.statusは0から1に切り替わります。

上記のバリデーションで、ユーザ認証が済んでいないユーザに対してバリデーションをかけています。

ifのネストが深い点、errorsの追加の行が二つ存在する点が可読性を損ねている気がしているのですが、
もっといい書き方がありましたら、ご教示いただければ嬉しいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

もしかしたら、このように書けるのではないでしょうか

ruby

1user_auth = UserAuth.find_by(user_id: user.id) # self は省略可 2 3# user_auth がnil ならnil を返す 4# user_auth がnil でなければメソッドを呼び出し判定処理をする 5errors[:user_auth] << I18n.t('validate.not_auth_user') unless user_auth&.status&.eql?(1) 6return if errors.any? 7 8# エラーがないので処理を続行 9# ...

この、「ユーザが認証済みか否かを判定する処理」をメソッドに切り出すこともできるかもしれません

ruby

1errors[:user_auth] << I18n.t('validate.not_auth_user') unless user_already_authorized? 2return if errors.any? 3#... 4 5AUTHORIZED_USER = 1 # ※UserAuth クラス内で定義 6UNAUTHORIZED_USER = 0 # ※UserAuth クラス内で定義 7 8def user_already_authorized? 9 user_auth = UserAuth.find_by_user_id(user.id) 10 user_auth&.status&.eql?(UserAuth::AUTHORIZED_USER) 11end

エラーがあった場合にする処理、そうでない場合の処理、とメソッド内で上下に2分することができれば、ネストの浅いコードを書くことができると思います

以上、何か参考になれば幸いです

Links

投稿2016/11/29 19:09

gouf

総合スコア2321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

azuno_mix

2016/12/06 03:14

Safe Navigation Operatorは、知りませんでした。 すごく便利なメソッドですね! また、メソッド切り出しや、定数に落とし込むなどのテクニックも大変参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問