概要:三項演算子での記述でつまずいた点を記述する。
- 三項演算子を使用して修正を依頼されたコードの意味が理解できない。
修正前のコード
tops_controller.rb
def set_varriable
@language = params[:la]
action = params[:action]
return render "tops/en/#{action}" if @language.try(:include?, 'en')
render :"#{action}"
end
viewから送られてくるparams[:la]を判断してparams[:la]が'en'を含んでいればrenderで"tops/en/#{action}"に遷移する。
それ以外の場合はrenderで"#{action}"に遷移するという内容であった。
しかし@language.try(:include?, 'en')
と書くより @language == 'en'
で判断した方がいいということで下記三項演算子での記述に変更することになった。
@language = params[:la] ? params[:la] : 'ja'
ここで疑問が。。。三項演算子って私の認識ではこうだったんです。
条件式 ? 真の時の値 : 偽の時の値
上記の書き方は@language = params[:la]
の部分が果たして条件式なのだろうか???
(正確にはparams[:la]のみが条件式 ↓下記コメント参照)
困ったのでrails consoleで確認する。
terminal
[1] pry(main)> @language = nil ? 'en' : 'ja'
=> "ja"
[2] pry(main)> @language = nil ? 'ja' : 'en'
=> "en"
[3] pry(main)> @language = true ? 'en' : 'ja'
=> "en"
[4] pry(main)> @language = false ? 'en' : 'ja'
=> "ja"
なるほど、続いて下記を実行する
terminal
[5] pry(main)> params = {:la=>"en"}
=> {:la=>"en"}
[6] pry(main)> @language = params[:la] ? params[:la] : 'ja'
=> "en"
[7] pry(main)> params = {:la => nil}
=> {:la=>nil}
[8] pry(main)> @language = params[:la] ? params[:la] : 'ja'
=> "ja"
[9] pry(main)>
なるほど、なるほど。
つまりはこういうことだったのか。
@language = params[:la]
が存在すれば真を返す。
@language = params[:la]
が存在しなければ偽を返す。
左辺はこれだけで条件式として見なされるのだ。
修正後のコード
tops_controller.rb
def set_varriable
@language = params[:la] ? params[:la] : 'ja'
action = params[:action]
return render "tops/en/#{action}" if @language == 'en'
render :"#{action}"
end
renderの条件が@language == 'en'
で表されシンプルになった。