2013-02-21 2 views
0

country Значение по умолчанию атрибута равно нулю.Как установить оператор «If» с помощью nil?

В таблице стран, в какой-либо записи есть image_url, а остальные атрибуты записи country - ноль.

Так что я закодированы это помощник

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

Однако, он возвращает ошибку, когда image_url была равна нулю

Something went wrong 

Как я могу это исправить?

ответ

3

Условия: Пользователь должен иметь страну, и эта страна должна иметь image_url. Только тогда будет что-то показать. К счастью, это простой твик:

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

Если вы параноик, вы должны убедиться, что user не nil либо.

Надеюсь, что это поможет!

+0

Спасибо! Он по-прежнему возвращает эту ошибку 'ActionView :: Template :: Error (undefined method' + 'для nil: NilClass): ' – HUSTEN

+0

@HUSTEN - Рад, что помогло! Но я сомневаюсь, что другая ошибка связана (тем более, что вы никогда не используете дополнение здесь), поэтому вам придется отслеживать ее отдельно. –

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 

Law of Demeter состояния:

Каждый блок должен иметь только ограниченные знания о других единицах: только единицы «тесно» связаны с текущим подразделением.

Также проверьте Rail Best Practices Law of Demeter; если ничего другого вы не сбережете себе лишнее предложение в вашем операторе if &, ваш код выглядит симпатичным.

Смежные вопросы