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

CarrierWave causing json output to become nested on photo key

我在 CarrierWave 上遇到了一个奇怪的问题,我在其他任何地方都找不到。

我正在使用 Jbuilder 为我的 API 生成 JSON。我在 table 上有一个照片 table 和一个 url 字段。

照片模型上没有 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

谢谢!

当你做类似 mount_uploader 的事情时。 CarrierWave 将覆盖读取列方法并将其替换为 return 您的上传者的对象。

因此,当您尝试在照片上调用 url 时,它 return 您是使用 url 方法的上传者,因此它将继续调用 url,并获得 url 值。所以你的 json.

中有三个 url

但您仍然可以使用url_url方法获取原始值。

所以如果你只是想得到具体的url,那么这样做就可以了。

 json.photos exercise.photos, :id, :url_url, :order #url_url is the url column value.

@Arel,如果您需要保持相同的 json 哈希结构,只需覆盖上传器中的 :serializable_hash 方法 class:

class PhotoUploader < CarrierWave::Uploader::Base
  def serializable_hash
    model.read_attribute :url
  end
end