Доступ к изображениям в 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
Любые предложения будут ценны.
1 ответ
Были там как 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)
В 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)
Если твой Post
модель имеет ActiveStorage::Attachment
ты можешь просто позвонить
@post.file.service_url
или @post.file.public_url
если у вас есть has_one_attached :file
в вашей модели.