У меня есть приложение React / Rails, где пользователь может загрузить аватар из React, и он отправляется на direct_uploads
через библиотеку с именем ActiveSotrageProvider
. Я могу нажать direct_uploads
и похоже, что файл загружается в мою корзину AWS s3, но не уверен, как я на самом деле связываю это с моим пользователем модели. Вот мои соответствующие файлы:
от React:
<ActiveStorageProvider
endpoint={{
protocol: 'http',
host: 'localhost',
port: '9000',
model: 'User',
path: `${this.state.user.id}`,
model: 'User',
header: {
"Authorization": localStorage.getItem("token")
}
}}
Мои рельсы Модель пользователя:
class User < ApplicationRecord
has_secure_password
has_one_attached :avatar
def avatar_filename
self.avatar.filename.to_s if self.avatar.attached?
end
def avatar_attached?
self.avatar.attached?
end
has_many :sightings
has_many :animals, through: :sightings
has_many :comments, :as => :commentable, dependent: :destroy
validates :username, uniqueness: true
end
Файл моего пользовательского контроллера:
class Api::V1::UsersController < ApplicationController
before_action :find_user, only: [:update, :show, :destroy]
def index
@users = User.all
render json: @users
end
def create
byebug
@user = User.new(
username: params[:username],
password: params[:password]
)
if @user.save
encode_token(@user.id)
render json: {user: UserSerializer.new(@user), token: ENV['jwt']}, status: :ok
else
render json: {errors: @user.errors.full_messages}
end
end
def show
if @user
if curr_user.id == @user.id && !@user.avatar.attached?
render json: @user
elsif
curr_user.id == @user.id && @user.avatar.attached?
@user.avatar.attach(params[:user][:avatar])
render json: @user
else
render json: {errors: @user.errors.full_messages }, status: :unprocessible_entity
end
else
render json: {errors: "User not found!"}
end
end
def update
beybug
if curr_user.id == @user.id
@user.update(user_params)
@user.avatar.attach(params[:user][:avatar])
if @user.save
render json: @user, status: :accepted
else
render json: { errors: @user.errors.full_messages }, status: :unprocessible_entity
end
end
end
def destroy
if curr_user.id == @user.id
@user.avatar.purge_later if @user.avatar
@user.delete
render json: "user deleted"
else
render json: { errors: "You are not authorized to delete"}
end
end
private
def user_params
params.require(:user).permit(:name, :username, :password, :avatar)
end
def find_user
@user = User.find(params[:id])
end
end
class DirectUploadsController < ActiveStorage::DirectUploadsController
skip_before_action :verify_authenticity_token
end
мои маршруты:
Rails.application.routes.draw do
# For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
post "/rails/active_storage/direct_uploads", to: "direct_uploads#create"
namespace :api do
namespace :v1 do
resources :users, only: [:index, :show, :create, :update, :destroy]
resources :animals, only: [:index, :show, :update]
resources :sightings, only: [:index, :show, :create, :update, :destroy] do
resources :comments
end
resources :comments, only: [:create, :update, :destroy] do
resources :comments
end
post "/login", to: "auth#login"
get "/current_user", to: "auth#get_user_from_token"
end
root to: 'sightings#index'
end
end
Не уверен, каким будет следующий шаг на самом деле присоединения к модели пользователя.