Как связать файл Direct_upload Active Storage AWS S3 из React с моделью в Rails? - PullRequest
0 голосов
/ 25 марта 2019

У меня есть приложение 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

Не уверен, каким будет следующий шаг на самом деле присоединения к модели пользователя.

...