Скрепка неправильный URL-адрес вложения на ошибки проверки - PullRequest
4 голосов
/ 03 апреля 2011

У меня есть предварительный просмотр прикрепленного изображения в моей форме обновления.Проблема возникает, когда пользователь получает ошибки проверки в поле вложения.В этом случае URL-адрес миниатюры изображения становится таким, как если бы изображение было загружено без каких-либо ошибок (оно показывает имя файла, который не был сохранен на сервере).

Вот как я получаю URL-адрес изображения в моем представлении: <%= image_tag(@product.photo.url(:medium)) %>.

Контроллер:

def update
  @product = Product.find(params[:id])
  @product.update_attributes(params[:product]) ? redirect_to('/admin') : render(:new)
end

def edit
  @product = Product.find(params[:id])
  render :new
end

Модель:

class Product < ActiveRecord::Base

  <...>

  @@image_sizes = {:big => '500x500>', :medium => '200x200>', :thumb=> '100x100>'}

  has_attached_file :photo, :styles => @@image_sizes, :whiny => false
  validates_attachment_presence :photo
  validates_attachment_content_type :photo, :content_type => ['image/jpeg', 'image/jpg', 'image/png', 'image/gif'], :message => I18n.t(:invalid_image_type)
  validates_attachment_size :photo, :less_than => 1.megabytes, :message => I18n.t(:invalid_image_size, :max => '1 Mb')
  after_post_process :save_image_dimensions

  <...>

end

UPD: Самое простое решение - добавить @photo_file_url = @product.photo.url(:medium) в действие обновления контроллерадо @product.update_attributes и <% @photo_file_url ||= @product.photo.url(:medium) %> в представлении.

Ответы [ 2 ]

1 голос
/ 13 мая 2011

У меня фактически была та же проблема, и вот то, что я сделал (что кажется хаком), но работает и покажет обновление по умолчанию или предыдущее изображение при ошибке обновления

after_validation :logo_reverted?

def logo_reverted?
  unless self.errors[:logo_file_size].blank? or self.errors[:logo_content_type].blank?
    self.logo.instance_write(:file_name, self.logo_file_name_was) 
    self.logo.instance_write(:file_size, self.logo_file_size_was) 
    self.logo.instance_write(:content_type, self.logo_content_type_was)
  end
end
1 голос
/ 03 апреля 2011

В моем приложении были похожие проблемы, поэтому я использовал:

<%= image_tag(@product.photo.url(:medium)) if @photo.valid? %>

Таким образом, ничего не отображается, если фотография недействительна (т.е. успешно создана), но при редактировании существующих записей изображение отображается.

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

...