0

country属性のデフォルト値はnilです。

国の表では、一部のレコードにがimage_urlあり、残りのレコードのcountry属性はnilです。

だから私はこれをヘルパーでコーディングしました

def image(user)
    if user.country.image_url
        image_tag "flags/#{user.country.image_url}.png" 
    end
end

image_urlただし、 nilの場合はエラーを返します

Something went wrong

どうすれば修正できますか?

4

2 に答える 2

3

2つの条件が必要です。ユーザーには国が必要であり、その国にはimage_urlが必要です。そうして初めて、何かを示すことができます。幸いなことに、これは簡単な調整です。

def image(user)
    if(user.country && user.country.image_url)
        image_tag "flags/#{user.country.image_url}.png" 
    end
end

あなたが妄想的であるならば、あなたはそれがどちらでもuserないことを確認するべきです。nil

お役に立てば幸いです。

于 2013-02-21T22:03:39.790 に答える
3

このようなメソッドチェーンは確かに機能しますが、メソッドの委任を実装すると、コードは非常にきれいに見え、結合が少なくなります。

ユーザーモデルの内部:

class User < ActiveRecord::Base

     belongs_to :country

     delegate :image_url, :to => :country, :prefix => true, :allow_nil => true       

end

これで、ヘルパーは単純になります。

def image(user)
    if user.country_image_url
        image_tag "flags/#{user.country_image_url}.png" 
    end
end

デメテルの法則は次のように述べています。

各ユニットは、他のユニットについての知識が限られている必要があります。現在のユニットに「密接に」関連しているユニットのみです。

デメテルの法則のレールベストプラクティスもチェックしてください。他に何もなければ、ifステートメントの余分な句を自分で保存していて、コードはきれいに見えます。

于 2013-02-21T22:19:59.277 に答える