当我将它包含在关联模型的 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
我对编码还很陌生,我正在尝试为新应用程序设置 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