Использование обратного вызова after_find для перезаписи значений nil - PullRequest
0 голосов
/ 09 августа 2011

Сейчас у меня есть модель Rails 3 для хранения данных профиля.Один из столбцов в этой таблице базы данных содержит URL-адрес изображения, если пользователь выбирает отображение изображения профиля (это также интегрируется с API-интерфейсом Graph Facebook для сохранения URL-адреса изображения профиля пользователя, если он входит в систему с Facebook, но это не имеет значения).Проблема, с которой я сталкиваюсь, заключается в том, что когда столбец изображения равен нулю, мне нужен способ установить его на путь по умолчанию на моем сервере.Обратите внимание, что я не могу использовать значение по умолчанию в миграции или модели здесь.Я думал о том, чтобы использовать after_find, но следующее не работает:

В модели профиля:

  def after_find
    if self.image.nil?
      self.image = "/assets/generic_profile_image.png"
    end
  end

В представлении (HAML):

.profile_pic
    = image_tag @user.profile.image

ПрофильМодель связана с моделью пользователя через ассоциацию has_one.Прямо сейчас вместо динамического превращения атрибута изображения в "/assets/generic_profile_image.png", похоже, ничего не происходит, оставив меня со следующим сгенерированным кодом на моей странице:

    <div class='profile_pic'>
      <img alt="Assets" src="/assets/" />
    </div>

Любые предложения о том, как исправитьэта проблема будет принята с благодарностью!

PS Об условном представлении не может быть и речи, поскольку изображение профиля отображается слишком много мест!

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Просто создайте условие в модели и укажите его в представлении.

class User
  delegate :image, :to => :profile, :prefix => true, :allow_nil => true

  def picture_url
    if profile_image.present?
      profile_image
    else
      "/assets/generic_profile_image.png"   
    end
  end
end

Мне нравится этот подход, потому что вам не придется запускать SQL-запрос, когда вы хотите изменить изображение по умолчанию.

Я добавил делегата, чтобы не нарушать закон Деметры.

Конечно, вы уже догадались, код просмотра:

.profile_pic
    = image_tag @user.picture_url       
1 голос
/ 09 августа 2011

Полагаю, ваш обратный вызов after_find фактически не вызывается. Вы должны определить это так:

class Profile < ActiveRecord::Base
  after_find :update_image

  def update_image
    if self.image.nil?
      self.image = "/assets/generic_profile_image.png"
    end
  end
end

Теперь все должно работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...