その他
    ホーム 技術発信 DoRuby railsのand/orを使った機能

    railsのand/orを使った機能

    この記事はアピリッツの技術ブログ「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 を使える様になると細かい所で便利なので、ぜひ覚えましょう。