【问题标题】:Rails 4, carrierwave, minimagick: image version called every image load? (even not on uplaoad)Rails 4,carrierwave,minimagick:图像版本调用每个图像加载? (即使没有上传)
【发布时间】:2015-04-07 14:20:45
【问题描述】:

我有一个问题/问题 - 实际上我不确定,也许这就是它的行为方式(?)

我正在使用带有carrierwave的Rails 4来上传文件,我刚刚添加了minimagick gem来创建上传图像的版本。

当我上传图片时 - 效果很好并制作了版本。
但是当我加载带有图像的页面时,它似乎为屏幕上显示的每个图像调用“版本”方法....(而不是上传过程!只显示图像!)
因此,即使在我上传图像并实际创建它的版本之前 -> 我已经在我的上传文件中添加了一个“版本”方法 -> 在我的网站中刷新了一个页面 -> 调用了“版本”方法(还没有上传任何东西)

我的上传文件:

class PhotoUploader < CarrierWave::Uploader::Base

  include CarrierWave::MiniMagick
  storage :fog

  version :nav_thumb, if: :is_avatar? do
    process :resize_to_fit => [50, 50]
  end

  version :box_thumb, if: :is_logo? do
    process :resize_to_fit => [40, 40]
  end

  def is_avatar?(picture)
    mounted_as == :avatar
  end

  def is_logo?(picture)
    mounted_as == :logo
  end
end

似乎我页面中显示的每个图像都在使用is_avatar? 方法(我使用pry 调试器查看发生了什么)

并且 -> 它使我的页面加载速度变慢,这与我希望通过较小的图像版本实现的效果相反。

这是正常行为吗?每次我加载图像时都应该使用version 方法吗?
我该怎么做才能解决它?

谢谢。

【问题讨论】:

  • 我认为亚马逊 S3 服务是上传图片的更好方式...
  • 我正在将图像上传到 S3....但这与我的问题无关

标签: ruby-on-rails ruby carrierwave minimagick


【解决方案1】:

我认为问题是由于将逻辑填充到您的版本方法中。与其在其中编写 if 语句,不如尝试将它们更改为:

version :nav_thumb do
   process resize_to_fit: [50,50]
end

version :box_thumb do
   process resize_to_fit: [40,40]
end

然后编写一个额外的方法来确定应该使用哪个图像版本(然后使用image_tag image.image_url(:version) 在您的视图中实现结果)。

【讨论】:

  • 我在这里使用逻辑的原因是因为上传文件适用于少数类,并且每个类都有不同的版本。我不想为用户头像创建那种大小的徽标,反之亦然
【解决方案2】:

尝试将您的 is_*? 方法放在 protected 块中:

...
version :nav_thumb, if: :is_avatar? do
  process :resize_to_fit => [50, 50]
end

protected
  def is_avatar?(picture)
    mounted_as.eql?(:avatar)
  end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多