保存后载波错误 image_url
Carrierwave wrong image_url after save
我正在使用 Carrierwave 从远程上传图像 url :
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"}
正如你看到的图像url是这样的:
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不见了!!
请帮忙!!
更新
看起来 carrierwave 正在上传器中检查 store_dir 以显示图像 url,在我的情况下,我在保存图像之前覆盖它,我想使用该自定义 store_dir
是的,那是因为 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
table 上可能会更好因此:
- 向您的
Image
模型添加一列,可能是 store_uid
在您的 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
一种更简洁的方法,也是经常被推荐的方法,是为每种图像创建另一个上传器,以确保应用程序的一致性
我正在使用 Carrierwave 从远程上传图像 url :
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"}
正如你看到的图像url是这样的:
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不见了!!
请帮忙!!
更新
看起来 carrierwave 正在上传器中检查 store_dir 以显示图像 url,在我的情况下,我在保存图像之前覆盖它,我想使用该自定义 store_dir
是的,那是因为 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
table 上可能会更好因此:
- 向您的
Image
模型添加一列,可能是 store_uid 在您的 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
一种更简洁的方法,也是经常被推荐的方法,是为每种图像创建另一个上传器,以确保应用程序的一致性