保存后Carrierwave错误的image_url

时间:2016-07-03 23:22:31

标签: ruby-on-rails carrierwave

我正在使用Carrierwave从远程网址上传图片:

 def save

      uid = SecureRandom.uuid

      storedir = "uploads/#{uid}"

      image = Image.new

      image.image.store_dir = storedir

      image.remote_image_url = "a remote url here"

      if image.save!

          respond_to do |format|

              format.js

              format.json { render json: {:saved => "#{image.image_url}", :id => "#{image.id}"} }
          end

      end

  end

返回的结果是正确的:

 Object { saved="https://mybucket.s3-eu-west-1.amazonaws.com/uploads/58406672-c227-4cec-a846-04c443e70f33/thumb_yr169-ae2f3bc4-74f4-47ee-950c-2e06756525b9-v2.png",  id="47"}

正如您所见,图片网址是:

https://mybucket.s3-eu-west-1.amazonaws.com/uploads/58406672-c227-4cec-a846-04c443e70f33/thumb_yr169-ae2f3bc4-74f4-47ee-950c-2e06756525b9-v2.png

当我去检查文件时,它位于正确的文件夹中,但当我转到Rails控制台并查找该记录时,image_url的结果是错误的:

> Rails console
> Image.find(47).image_url
> https://mybucket.s3-eu-west-1.amazonaws.com/uploads/thumb_yr169-ae2f3bc4-74f4-47ee-950c-2e06756525b9-v2.png

/ uploads /之后的uid消失了!!

任何帮助请!!

更新

看起来carwave在上传器中检查store_dir以显示图片网址,在我的情况下,我在保存图片之前覆盖它,我想使用该自定义store_dir

1 个答案:

答案 0 :(得分:1)

是的,那是因为CarrierWave和大多数类似的库一样,试图动态构建你的url。

将此添加到您的ImageUploader

#ImageUploader
def uid
  '58406672-c227-4cec-a846-04c443e70f33'
end

def store_dir
  "uploads/#{uid}"
end

#XController
def save
  image = Image.new
  image.remote_image_url = "a remote url here"
  if image.save!
    respond_to do |format|
      format.js
      format.json { render json: {:saved => "#{image.image_url}", :id => "#{image.id}"} }
    end
  end
end

<强>更新

不完全确定为什么要覆盖商店,但为了做到这一点,我认为通过在images表格中存储其他详细信息可能会更好:

  1. Image模型中添加一列,可能是store_uid
  2. 在您的ImageUploader中,更改您的store_dir以使用您的构建器或字段名称,例如,如果图片上的列为store_uid,其值为whatever-uid-has-been-stored-here,您可以做:

    def store_dir # /uploads/whatever-uid-has-been-stored-here "uploads/#{model.store_uid}" end

  3. 一种更清洁的方法,通常建议的方法是为每种图像创建另一个上传器,以保证应用程序的一致性