当我将它包含在关联模型的 GET 请求中时,我缺少 AWS URL for a Ruby on Rails model

I am missing the AWS URL for a Ruby on Rails model when I include it in the GET request of an associated model

我对编码还很陌生,我正在尝试为新应用程序设置 Rails 5 后端。我在两个模型(Projects 和 Skills)之间创建了多对多关系,它们都使用来自 Amazon Web Services 的 S3 存储来附加图像。

我可以为每个模型发出 GET 请求并在 json 响应中查看工作图像 URLs,但是当我尝试在项目的 GET 请求中包含技能时, 我收到了没有图像的技能 URL.

这是一些示例 json 我通过调用技能 "HTML":

created_at: "2019-12-06T04:27:52.537Z"
id: 4
image: (working URL for skill image)
name: "HTML"
updated_at: "2019-12-06T04:27:52.540Z"

这里是 json 的项目,其中嵌套了技能 "HTML":

created_at: "2019-12-07T15:11:32.592Z"
id: 53
image: (working URL for project image)
skills: Array(1)
  0:
    created_at: "2019-12-06T04:27:52.537Z"
    id: 4
    name: "HTML"
    updated_at: "2019-12-06T04:27:52.540Z"
    __proto__: Object
    length: 1
  __proto__: Array(0)
title: "Card Game"
updated_at: "2019-12-07T19:35:08.751Z"

可以看到,技能"HTML"在嵌套的时候突然少了对应的图片URL

这是我对项目控制器的基本设置:

class ProjectsController < ApplicationController

  def index
    @projects = Project.all
    render json: @projects, include: :categories
  end

这是我的技能序列化程序:

class SkillSerializer < ActiveModel::Serializer
  attributes :id, :name, :created_at, :updated_at, :image

  def image
    object.image.service_url if object.image.attached?
  end
end

有谁知道如何将属于某个模型的网络存储 URL 包含在另一个模型关联中时?

我推荐你使用FastJsonApi。它比 jbuilder 和活动模型序列化程序快得多。 在你的情况下。你可以这样使用。

class SkillSerializer < ActiveModel::Serializer
  attributes :id, :name, :created_at, :updated_at

  attribute :product_image_url do |object|
    Rails.application.routes.url_helpers.url_for(object.image)
  end
end

将项目控制器更改为以下内容:

class ProjectsController < ApplicationController
  include Rails.application.routes.url_helpers

  def index
    @projects = Project.all
    projects_with_images = @projects.map do |project|
      new_project = project.attributes.symbolize_keys
      new_project[:image] = rails_blob_path(project.image, only_path: true)

      skills = project.skills
      skills_with_images = skills.map do |skill|
        new_skill = skill.attributes.symbolize_keys
        new_skill[:image] = rails_blob_path(skill.image, only_path: true)
        new_skill
      end

      new_project[:skills] = skills_with_images
      new_project
    end

    render json: {projects: projects_with_images}
  end

可能不是最有效的,但它似乎有效!

这是我的表演路线的简化版本,用于确保模型附有其图像 url:

def show
    @project = Project.find(params[:id]) 
    project_with_image = @project.attributes.symbolize_keys
    project_with_image[:image] = rails_blob_path(@project.image, only_path: true)

  render json: project_with_image