CarrierWave导致json输出嵌套在照片键上

时间:2015-01-28 05:02:54

标签: ruby-on-rails ruby json carrierwave jbuilder

我对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

谢谢!

2 个答案:

答案 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.