5

想要添加附件的 url,同时响应获取父资源(比如人)的嵌套资源(比如文档)的请求。

# people_controller.rb  
def show
   render json: @person, include: [{document: {include: :files}}]
end


# returns
# {"id":1,"full_name":"James Bond","document":{"id":12,"files":[{"id":12,"name":"files","record_type":"Document","record_id":689,"blob_id":18,}]}


# MODELS
# person.rb  
class Person < ApplicationRecord
   has_one :document, class_name: "Document", foreign_key: :document_id
end

# document.rb
class Document < ApplicationRecord
   has_many_attached :files
end

问题是,我想在 React 前端设置中显示文件或提供指向文件的链接,它没有像 url_for 这样的辅助方法。正如这里指出的那样

任何帮助将不胜感激。

4

4 回答 4

6

我所做的是在模型中创建此方法

def logo_url
  if self.logo.attached?
    Rails.application.routes.url_helpers.rails_blob_path(self.logo, only_path: true)
  else
    nil
  end
end

要将 logo_url 添加到您的响应 json 中,您可以添加methods.

render json: @person, methods: :logo_url

官方指南中对此进行了解释=)

于 2018-07-25T19:19:06.783 回答
5

在挖掘了 Active Storage 的源代码后,我发现了暴露方法的模型方法:service_url,它返回一个指向附件文件的短暂链接。

然后这个答案帮助包含控制器响应json中的方法。

所以,为了达到我需要的输出,我必须做

render json: @person, include: [{document: {include: {files: {include: {attachments: {include: {blob: {methods: :service_url}}}}} }}]
于 2018-04-20T03:36:46.730 回答
1
class Meal < ApplicationRecord
  has_many_attached :photos
end  

class MealsController < ApplicationController
  def index
    render json: current_user.meals.map { |meal| meal_json(meal) }
  end

  def show
    render json: meal_json(current_user.meals.find!(params[:id]))
  end

  private

  def meal_json(meal)
    meal.as_json.merge(photos: meal.photos.map { |photo| url_for(photo) })
  end
end
于 2018-09-21T23:29:27.547 回答
0

这一切归功于@JuanCarlosGamaRoa,这对我有用。

我有一个应用程序,其中每个“产品”都有一个“main_image”附件。

# app/models/product.rb
def main_image_url
  if self.main_image.attached?
    Rails.application.routes.url_helpers.rails_blob_path(self.main_image, only_path: true)
  else
    nil
  end
end
# app/views/products/_product.json.jbuilder
json.extract! product, :id, :price, :created_at, :updated_at, :main_image_url
json.url product_url(product, format: :json)
于 2022-02-18T04:14:25.267 回答