我对CarrierWave有一个奇怪的问题,我在其他任何地方都找不到。
我正在使用Jbuilder为我的API生成JSON。我桌上有一张照片桌和一个网址字段。
在照片模型上没有mount_uploader :url PhotoUploader
,我的JSON看起来像这样:
"photos": [
{
"id": 11,
"url": "https://s3.amazonaws.com/...",
"order": 1
},
{
"id": 12,
"url": "https://s3.amazonaws.com/...",
"order": 2
}
]
但是当我添加上传器时,我的JSON最终看起来像这样:
"photos": [
{
"id": 3,
"url": {
"url": {
"url": "https://bucket-name.s3.amazonaws.com/uploads/photos/https%3A//s3.amazonaws.com/bucket-name/uploads/folder/photos/img-name.jpg"
}
},
"order": 2
},
{
"id": 2,
"url": {
"url": {
"url": "https://bucket-name.s3.amazonaws.com/uploads/photos/https%3A//s3.amazonaws.com/bucket-name/uploads/folder/photos/img-name.jpg"
}
},
"order": 1
}
],
一切正常,但是JSON看起来非常混乱,并且很难迭代。此外,任何人都可以解释为什么URL看起来很奇怪,重复两次?
Jbuilder代码:
json.exercises current_user.current_training_week.exercises.uniq do |exercise|
json.id exercise.id
json.name exercise.name
json.description exercise.description
json.photos exercise.photos, :id, :url, :order
json.videos exercise.videos, :id, :url
end
谢谢!
答案 0 :(得分:2)
@Arel,如果你需要保持相同的json哈希结构,只需在你的上传器类中覆盖:serializable_hash方法:
class PhotoUploader < CarrierWave::Uploader::Base
def serializable_hash
model.read_attribute :url
end
end
答案 1 :(得分:1)
当您执行mount_uploader
之类的操作时。 CarrierWave将覆盖读取列方法并将其替换为返回上传器的对象。
因此,当您尝试在照片上调用url时,它会返回一个带有url方法的上传器,因此它将继续调用url,并获取url值。所以你的json中有三个url。
但您仍然可以使用url_url
方法获取原始值。
因此,如果您只想获取特定的网址,只需这样就可以了。
json.photos exercise.photos, :id, :url_url, :order #url_url is the url column value.