【问题标题】:I am missing the AWS URL for a Ruby on Rails model when I include it in the GET request of an associated model当我将 Ruby on Rails 模型的 AWS URL 包含在关联模型的 GET 请求中时,我错过了它
【发布时间】:2019-12-07 21:55:06
【问题描述】:

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

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

这是我调用技能“HTML”得到的一些示例 json:

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?

【问题讨论】:

  • 你能发布你用来显示图像的代码吗?我发现使用浏览器检查器查看它试图在哪里找到图像然后从那里去是最有用的。
  • @RockwellRice 该 URL 不存在让我渲染任何内容。我已经更新了我的帖子以显示我回来的 json。
  • image 属性似乎包含链接到 S3 中图像的 URL。除了portfolio 位。可能需要加个/什么的,是portfolio的页面URL吗?
  • @RockwellRice json 的两个 sn-ps 中的图像 URL 都可以正常工作。第二个 sn-p 中的图像 URL 连接到项目,而不是技能。我进行了另一次更新以使差异更加清晰。

标签: ruby-on-rails amazon-web-services amazon-s3 ruby-on-rails-5 rails-activestorage


【解决方案1】:

我推荐你使用 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

【讨论】:

    【解决方案2】:

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

    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
    

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

    这是我的展示路线中的一个简化版本,用于确保模型附有它的图片网址:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多