Несколько вложений скрепки сохраняются без указания входного файла

У меня есть модель пользователя, которая имеет связь has_many с моделью активов (стандартная настройка скрепки). В представлении я использую помощник fields_for для настройки нескольких полей файла для ресурсов. Если конечный пользователь не укажет файл, записи актива не будут сохранены. Чего я и хочу. Все идет нормально.

Затем я добавил атрибут заголовка в модель активов. Я также добавляю текстовое поле к каждому соответствующему полю файла. Вот в чем проблема. Если конечный пользователь не укажет файл или заголовок, записи актива будут СОХРАНЕНЫ. Сохраненная запись имеет заголовок из пустой строки, а все остальные атрибуты скрепки равны нулю.

Вопрос в том, как я могу предотвратить сохранение записи актива, когда нет файла, назначенного атрибутам скрепки? И поскольку активы являются необязательными, я не хочу, чтобы генерировалась какая-либо обратная связь об ошибках. Есть идеи? Спасибо.


person Ziyu    schedule 26.08.2012    source источник


Ответы (1)


Вы можете сделать validates_presence_of :caption в своей модели активов, но это также требует подписей. Как насчет проверки наличия файла на всех активах, связанных с пользователем before_validation? Что-то вроде этого, может быть? (возможно, потребуется некоторая настройка)

class User < AR::Base
  has_many :assets, :dependent => :destroy

  before_validation :check_assets

  def check_assets
    self.assets.each do |asset|
      unless asset.attachment.file?
        if asset.new_record?
          self.assets.delete(asset)
        else
          asset.destroy
        end
      end
    end
  end
end
person Peter Duijnstee    schedule 26.08.2012
comment
Отличная идея! Это будет делать именно то, что я хочу! Большое спасибо! Одной из настроек будет итерация копии активов, чтобы assets.delete(asset) вел себя хорошо. - person Ziyu; 27.08.2012