Rails6 ActiveStorage에서 S3에 저장하고 확인할 때까지

소개



rails로 웹 응용 프로그램을 만들 때 s3에 이미지를 저장하고 싶은 경우가 있었으므로 비망록으로 남겨 둡니다.

개발 환경



windows10
rails 6.1.3.1
vscode
aws s3 설정을 완료했다고 가정합니다.

Active Storage 설정



콘솔에서 다음을 입력합니다.$ rails active_storage:install$ rails db:migrate
Active Storage 서비스는 config/storage.yml에서 선언합니다. 응용 프로그램에서 사용하는 각 서비스에 대해 이름과 필요한 구성을 지정합니다.
기본적으로 amazon:의 코드가 주석 처리되어 있으면 주석 처리를 제거하십시오.
이 때의 들여 쓰기에주의!
(코멘트 아웃 무효시에 들여쓰기가 어긋나 버려, 에러의 원인이 됩니다. 필자는 이것에 쌓지 않고 소일시간 방황했습니다.)

config/storage.yml
test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: 作成したパケットのリージョン名
  bucket: s3で作成したパケット名

acces_key_id,secret_access_key에 대해서는 IAM에서 권한을 부여했을 때 앞에 둔 것을 credentials.yml에 기술$ rails credentials:edit
aws:
  access_key_id: 控えたもの
  secret_access_key: 控えたもの

다음에 이용하는 서비스를 ActiveStorage에 인식시킵니다만, 여기는 개발 환경마다 파일이 다릅니다.
이번에는 development 환경에서 s3을 사용했으므로 :amazon를 작성합니다.

config/environments/development.rb

 config.active_storage.service = :amazon


Gemfile에 다음 코드 추가gem "aws-sdk-s3", require: false그 후 이하 실행$ bundle install
이상으로 환경은 정돈되었습니다. 그리고는 실제로 Model, View, Controller를 써서 확인합니다.

파일을 레코드에 첨부



이번에는 user 모델, user 컨트롤러와 form을 이용하여 s3에 이미지를 저장해 보겠습니다.
스스로 작성할 때는 대응하는 것으로 재기록해 주세요.

우선 user 모델에 avatar를 갖게 합니다.

has_one_attached 매크로는 레코드와 파일 간에 일대일 매핑을 설정합니다. 각 레코드에는 하나의 파일을 첨부할 수 있습니다.

user.rb
class User < ApplicationRecord
    has_one_attached :avatar
end

그런 다음 사용자 컨트롤러 설정
user 모델에 name 과 age 를 가지고 있으므로 그들도 함께 받아 저장합니다.

user_controller.rb
class UserController < ApplicationController
    def index 
    end

    def create
        user = User.create!(user_params)
        redirect_to root_path
    end

    private
        def user_params
          params.permit(:name, :age, :avatar)
        end
end

routes.rb에 resources :user를 추가하십시오.
마지막으로 양식을 만듭니다.
avatar 양식은 form.file_field
user/index.html.erb
<%= form_with model: @user ,local: true do |form| %>

  <p>
    <%= form.label :name %><br>
    <%= form.text_field :name %>
  </p>

  <p>
    <%= form.label :age %><br>
    <%= form.text_field :age %>
  </p>

  <p>
    <%= form.label :avatar %><br>
    <%= form.file_field :avatar %>
  </p>

  <p>
    <%= form.submit %>
  </p>

<% end %>

이후 서버를 시작한 후localhost:3000/user에서 아래와 같은 화면이 나오므로 이미지 선택을 송신하면 s3에 저장됩니다.



이상! 수고하셨습니다.

참고



Rails 가이드(Active Storage 개요)
Rails 가이드 (Rails 시작)

좋은 웹페이지 즐겨찾기