@prneet

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

railsにおいての[?],[:]の記述についての疑問

[?],[:]の記述についての疑問

railsでタグの絞り込み検索機能を実装していたところ、記事を探して実装はできました。
しかし、検索アクションに記述したコードの読み方が理解できませんでした。

 def search
    @posts = params[:tag_id].present? ? Tag.find(params[:tag_id]).posts : Post.search(params[:keyword])
  end

上記のコード自身で読み解いていくと
params[:tag_id].present?
パラメータの:tag_idが空じゃなければ
Tag.find(params[:tag_id]).posts
タグをIDで取得して紐づいた投稿を取得。
そうでなければ、
Post.search(params[:keyword])
投稿を:keywordで取得。

上記のコードにおいて、present?の後ろの?はどのような役割でしょうか?
又、Tag.find(params[:tag_id]).posts : Post.search(params[:keyword])
こちらの:は条件式の||のような役割といった解釈で間違い無いでしょうか?

0 likes

3Answer

present??はrubyで慣習的に返り値に真偽値を返すメソッドにつけるものです。なので特に構文的な意味はありません。(メソッド名の一部です)

Tag.find(params[:tag_id]).posts : Post.search(params[:keyword]):は三項演算子という構文で用いられるものです。これは 判別式 ? Trueの時に返す値 : Falseの時に返す値みたいな書き方をすることができます。
今回は

params[:tag_id].present? ? Tag.find(params[:tag_id]).posts : Post.search(params[:keyword])

が対応する構文になっています!

1Like

条件 ? 式1 : 式2 は、三項演算子や条件演算子と呼ばれる書き方です。

if文に書き換えると以下のイメージです。

@posts = if params[:tag_id].present?
           Tag.find(params[:tag_id]).posts
         else
           Post.search(params[:keyword])
         end

条件params[:tag_id].present?
式1Tag.find(params[:tag_id]).posts
式2Post.search(params[:keyword])

条件が真の場合、式1の結果が@postsに入ります。
条件が偽の場合、式2の結果が@postsに入ります。

1Like

Your answer might help someone💌