【问题标题】:Paperclip wrong attachment url on validation errors关于验证错误的回形针错误附件 url
【发布时间】:2011-04-02 23:32:43
【问题描述】:

我的更新表单中有附件图片的预览。当用户在附件字段上收到验证错误时,就会出现问题。在这种情况下,图片缩略图 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&lt;% @photo_file_url ||= @product.photo.url(:medium) %&gt;之前。

【问题讨论】:

  • 请为您的editupdate 操作提供您的代码。
  • 它们非常简单。只有一些 CRUD 提示(Product.find(params[:id])@product.update_attributes(params[:product]) 分别用于编辑和更新)。
  • 使用这些更新编辑现有帖子是一种更常见的做法。

标签: ruby-on-rails validation url paperclip


【解决方案1】:

我实际上遇到了同样的问题,这就是我所做的(这似乎有点 hack)但可以工作,并且会在更新失败时显示默认或以前的图像

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

【讨论】:

  • 感谢您的回答!但我认为我的解决方案要容易一些。
  • @skrafi - 我同意您的解决方案要容易得多,但我无法让我的删除和更改正确显示,因为队列中仍有一个文件。我觉得我仍然需要检查错误以删除文件,以便我的删除 ajax 链接不会显示,除非那里真的有文件。想法?
【解决方案2】:

在我的应用中我遇到了类似的问题,所以我使用了:

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

这样,如果照片无效(即成功创建),则不会显示任何内容,但是当您编辑现有记录时,会显示图像。

希望对您有所帮助。

【讨论】:

  • 使用@product.valid? 会在新操作中导致非常奇怪的问题(我对新操作和更新操作使用相同的视图)。如果我在我的视图中某处有@product.valid?,我也会在照片字段上收到can't be blank 错误。请参阅 view codethe result(提交前)。
  • 嗯,你试过if @product.errors.any?吗?不知道为什么这很重要,但这是一个奇怪的错误,所以值得一试......
  • 我现在在上面显示的代码中使用@product.errors.any? 而不是@product.valid?。但是,如果我想在尝试上传新照片时在更新操作中显示照片并且发生任何错误,问题仍然存在。 Paperclip 仅在模型没有错误时保存照片。如果它有任何回形针,则会给出带有未保存文件名的 url。她在我上面的问题中 UPD 是我找到的唯一解决方案。
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 2012-02-02
  • 1970-01-01
  • 2023-03-28
  • 2015-08-13
相关资源
最近更新 更多