りゅうじの学習blog

学習したことをアウトプットしていきます。

三項演算子の書き方を例文を用いて解説

こんにちは、りゅうじです。

昨日の学習の際にコントローラーにこんなコードがありました。

#app/controllers/admin/articles/publishes_controller.rb

@article.state = @article.publishable? ? :published : :publish_wait

このコードの意味がわからないという方は読んで頂ければご理解頂けます。

if文を三項演算子で書いている

これが結論で今回の例を紐解いていきます。

まず雛形がどうなっているのか理解しましょう!

今回の例の三項演算子の雛形
@article.state = 条件.publishable? ? trueの処理 : falseの処理

@article.state三項演算子を代入しています。

三項演算子の部分を if文 で書いてみます。

#app/controllers/admin/articles/publishes_controller.rb

@article.state = if 条件.publishable?
                   trueの処理
                 else
                   falseの処理
                 end

こうして見比べるとわかりやすいですよね。

あとは publishable ってところを理解できれば今回の例文は完全に理解した!と言えますね。

結論から言うと、モデルに定義したものを呼び出しています。

Fat Controllerの解消を目的としていて、Controllerのロジックをモデルに移すことでControllerをスッキリさせる目的です。

モデルでどんな定義をしているか

今回の場合ですと

#app/models/article.rb

def publishable?
  Time.current >= published_at
end

わかりやすく日本語にしてみます。

#app/models/article.rb

def 公開可能?
  現在の時刻 より過去 公開日時
end

公開日時が現在の時刻より未来だと公開待ちになりますよね。

今回、公開可能なのは現在の時刻より公開日時が過去になっている場合だと定義しているという事です。

つまり publishable? をControllerで呼び出した時に、この定義を持ったメソッドとして使用できるという事です。

現在の時刻は変動していますよね。

なので @article.publishable? として呼び出した時の現在の時刻を呼び出せます。

まとめ

#app/controllers/admin/articles/publishes_controller.rb

@article.state = @article.publishable? ? :published : :publish_wait

@article.state に代入する内容は

公開可能?(Model内の定義:現在の時刻より公開日時が過去) なら :published(公開)にして

違うなら、:publish_wait(公開待ち)にして下さい。

という事です。

最後に

読んで頂いた方、ありがとうございました。