Rails 5.2 Rest API + Active Storage + React - Добавить URL-адрес вложения в ответ контроллера

Хотел бы добавить URL-адрес для прикрепленного файла, отвечая на запрос вложенного ресурса (скажем, Document) для родительского ресурса (скажем, Person).

# 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. Как указано здесь.

Любая помощь будет принята с благодарностью.


person anurag    schedule 18.04.2018    source источник
comment
Я изучаю, как отправлять файлы в REST API с помощью ActiveStorage на бэкэнде. Можете рассказать, как вам это удалось?   -  person Drazen    schedule 30.04.2018
comment
Не уверен, что в разделе комментариев будет содержаться все это объяснение. Пожалуйста, обратитесь к medium.com/@anurag_722/ написал специально, чтобы помочь вам. благодаря.   -  person anurag    schedule 02.05.2018


Ответы (2)


Покопавшись в исходном коде из Active Storage, я обнаружил методы модели, которые предоставляют метод, называемый: service_url, который возвращает кратковременную ссылку на файлы вложений.

Затем этот ответ помог включить метод в ответ json контроллера.

поэтому для достижения требуемого результата мне пришлось сделать

render json: @person, include: [{document: {include: {files: {include: {attachments: {include: {blob: {methods: :service_url}}}}} }}]
person anurag    schedule 20.04.2018

Я создал этот метод в модели.

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

что объясняется в официальных руководствах =)

person Juan Carlos Gama Roa    schedule 25.07.2018
comment
В конце концов, я также создал метод в модели и включил этот метод в ответ json. У рельсов желаний был простой атрибут / метод для того же самого. - person anurag; 25.07.2018
comment
Глупый вопрос, а что здесь logo? В моем случае это не определено, что бы я ни пробовал. Таким образом, это подтверждает, что метод logo_url вызывается, но он не работает полностью. Я использую только одну модель, поэтому нет document эквивалента. Некоторые более подробные сведения были бы оценены - person laimison; 01.08.2019