この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
railsのコーディング時にちょっと使える初心者向けのtipsです。
andやorを使って、if文や代入文を効率的に使いましょう。
仮に
@user = User.find(:first, :conditions => [“id = ?”, params[:user_id]])
if @user.name.blank?
render :text => “ユーザー名が空白です”
end
というようなプログラムがあったとします。
このままだと、params[:user_id]にuserと一致するデータがない場合、
@userがなくて、エラーが発生してしまいます。
というわけで
if @user and @user.name.blank?
とすると、@userがnilの場合、andの前で既にnilになっているので、
後部の式が評価されません。
こういう風に、and/orは慣れるとプログラムの効率があがります。
というわけで、もうちょっと詳しく解説してきます。
andの機能は、左辺を評価して、結果が真だったときは右辺の値を評価し、
右辺の値を返します。
true and true #=> true
true and false #=> false
実は、これは、右辺の値を返しているのです。
true and 1 #=> 1
1 and true #=> true
左の方がnil,falseでなければ、右の値を帰すため、
@name = @user and @user.name
という使い方もできます。
andの演算子の優先順位の関係で&&にする必要があります。
@name = @user && @user.name
この場合、@userがnilの場合には@nameにはnilが入り、
@userがある場合は@user.nameを代入する事になります。
そして、この逆の性質として、orがあります。
1 or 2 #=> 1
false or 2 #=> 2
false or false #=> false
これを利用すると、名前がないときには、名無しと代入する方法が
作れます。
@name = @name or “名無し”
@name = @name || “名無し”
@nameがnilでない場合は、@nameがそのまま保存され、@name がないときだけ”名無し”が登録されます。
or は||として書くことができ、演算子として上の式省略すると
@name ||= “名無し”
ともかけます。
railsだと
@use_id = params[:user_id] || @login_user.id
と、する事で、userの指定があれば、そのuser_idで検索し、
いなければlogin_userのidで検索するという構文をかけます。
if params[:user_id]
@user_id = params[:user_id]
else
@user_id = @login_user.id
end
みたいに書くよりは簡略化できます。
3項演算子の
@user_id = params[:user_id] ? params[:user_id] : @login_user.id
よりも効果的です。
普通に and / or を使える様になると細かい所で便利なので、ぜひ覚えましょう。