Доступ к изображениям в React через Rails Active Storage с помощью JSON

Я создаю Rails API, в котором я хотел бы использовать Active Storage для прикрепления изображений к сообщениям, а затем иметь возможность получить к ним доступ в REACT, например, получить ссылку url в JSON. Как преобразовать изображения Active Storage в URL-адреса для JSON. Есть ли лучший способ получить ссылку на изображения для сообщений?

Например, я бы хотел, чтобы URL-адрес изображения был включен в эту информацию:

От: http://localhost:3001/api/posts

[{"id":8,"title":"lolol","body":"lolol","created_at":"2018-07-19T23:36:27.880Z","updated_at":"2018-07-20T00:17:50.201Z","admin_user_id":1,"post_type":"Song","link":"dgdadg","song_title":"dgdadg","tag_list":[]},{"id":13,"title":"ddd","body":"dd","created_at":"2018-07-20T00:21:39.903Z","updated_at":"2018-07-20T00:21:39.907Z","admin_user_id":1,"post_type":"Song","link":"dddd","song_title":"ddd","tag_list":["Tag"]}]

Вот мой почтовый контроллер:

class PostsController < ApiController
    before_action :set_post, only: [:show, :update, :destroy]

  def index
    if params[:tag]
      @posts = Post.tagged_with(params[:tag])
    else
      @posts = Post.all
    end

    render :json => @posts
  end

  def show
    @post
    render :json => @post
  end

  def create
    @post = Post.new(post_params)
  end

  def update
    @post.update(post_params)
    head :no_content
  end

  def destroy
    @post.destroy
    head :no_content
  end

  private

  def post_params
    params.require(:post).permit(:title, :body, :song_title, :post_type, :admin_user_id, :link, :tag_list, :image)
  end

  def set_post
    @post = Post.find(params[:id])
  end

end

Любые предложения будут ценны.


person Alex Erling    schedule 20.07.2018    source источник


Ответы (3)


Были там около 2 недель назад и отказались от ActiveStorage из-за той же проблемы. Вы можете использовать магию контроллера, которая использует

url_for(@post.image)

нравиться

render :json => @post.merge({image: url_for(@post.image)})

Или что-то вдоль этих линий

class Post
  def image_url
    Rails.application.routes.url_helpers.rails_blob_path(self.image, only_path: true)
  end
end
    
# controller
render :json => @post.as_json(methods: :image_url)
person Denny Mueller    schedule 20.07.2018
comment
Первый способ - слияние неопределенных методов, а второй - неопределенный метод url_for $ ‹Post ...› Есть ли что-то еще, что мне нужно добавить, чтобы заставить их работать. Кроме того, есть ли у вас какие-либо предложения по поводу того, что вы использовали? Если вы не использовали Active Storage, я открыт для различных предложений! - person Alex Erling; 20.07.2018
comment
Я снимаю свое второе предложение. похоже, что метод недоступен на модели. Вы можете попробовать повозиться с Rails.application.routes.url_helpers.rails_blob_path(post.image, only_path: true). Что касается первого решения, я не могу вам помочь, поскольку проблема не в url_for, а в .merge. Я до сих пор использую скрепку. Он устарел в пользу activestorage, но все еще работает нормально. - person Denny Mueller; 23.07.2018

Если ваша Post модель имеет ActiveStorage::Attachment, вы можете просто позвонить @post.file.service_url или @post.file.public_url, если у вас есть has_one_attached :file в вашей модели.

person David Metta    schedule 26.02.2020

В jbuilder можно получить доступ к помощнику url_for. Так что ваш _post.json.jbuilder может работать примерно так

json.extract! post, :id, :body, :created_at, :updated_at
if post.image.attached?
  json.image_url url_for(post.image)
end
json.url product_url(product, format: :json)
person rissem    schedule 17.05.2020