2 votes

Accéder aux images dans React via Rails Active Storage en utilisant JSON

Je suis en train de créer une API Rails dans laquelle j'aimerais utiliser Active Storage pour attacher des images aux articles et pouvoir ensuite y accéder dans REACT, par exemple pour obtenir le lien url en JSON. Comment puis-je convertir les images d'Active Storage en urls pour JSON ? Existe-t-il une meilleure façon d'obtenir le lien vers les images pour les articles ?

Par exemple, je voudrais que l'url de l'image soit incluse dans ces informations :

De : 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"]}]

Voici mon contrôleur de poste :

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

Toute suggestion serait grandement appréciée.

3voto

Denny Mueller Points 817

Je suis passé par là il y a deux semaines et j'ai décidé de ne pas choisir ActiveStorage à cause du même problème. Vous pouvez faire de la magie de contrôleur qui utilise

url_for(@post.image)

comme

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

ou quelque chose de ce genre

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X