Загрузка изображений API Rails с Active Storage / S3, React и ActiveAdmin - PullRequest
0 голосов
/ 14 января 2020

Я создал приложение, использующее Rails API с внешним интерфейсом React и ActiveAdmin в качестве внутреннего сервера CMS, основанное на этого учебного пособия . Я добавляю модель, которая включает в себя изображение с использованием ActiveStorage для загрузки файлов, а также S3 для хранения на производстве.

app / models / photo.rb

class Photo < ApplicationRecord
    has_one_attached :image
end

приложение / контроллеры / photos_controller.rb

class PhotosController < ApplicationController
  include ActionController::Serialization
  before_action :set_photo, only: [:show, :update, :destroy]

  # GET /photos
  def index
    @photos = Photo.all
    render json: @photos.to_json
  end

  ...

  def photo_params
    params.require(:photo).permit(:image, :location_name, :region, :url)
  end
end

приложение / сериализаторы / photo_seralizer.rb

class PhotoSerializer < ActiveModel::Serializer
  attributes :id, :image, :location_name, :region, :url

  def image
    rails_blob_path(object.image, only_path: true) if object.image.attached?
  end
end

при просмотре конечная точка API, прикрепленное изображение не отображается в объекте фотографии, здесь приведен пример возврата. Есть ли что-то, что мне не хватает в Сериализаторе, что не добавляется в похожее изображение? Любая помощь будет принята с благодарностью, спасибо!

[{
  "id":1,
  "location_name":"Acreage Ciderhouse",
  "region":"Northern Metro",
  "url":"https://example.com/acreage-ciderhouse/",
  "created_at":"2020-01-09T15:18:33.298-07:00",
  "updated_at":"2020-01-09T15:27:40.594-07:00"
}]

1 Ответ

0 голосов
/ 14 января 2020

Activestorage сохраняет данные по-другому, я думаю, что ваш индекс вызывает данные из таблицы модели, но изображения сохраняются по отношению к другим таблицам. Поэтому, чтобы проверить, действительно ли изображение сохранено, используйте консоль rails для проверки.

rails c
@photo = Photo.find(1)
puts @photo.image.attached?

Если вы подтвердили, что изображение сохраняется правильно, вы можете выполнить следующие действия, чтобы добавить все URL-адреса изображений в запрос * 1004. *

def index
@photos = Photo.all
@photos.each do |p|
   if @photo.present? 
     image_url = { :image => (url_for p.image) }
     p.attributes.merge(image_url)
    end
end
render json: @photos.to_json
end

Я не тестировал приведенный выше код, просто написал, но я часто использовал его для своего API.

...