37
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rails5.2で導入されるActive Storageをのぞいてみる(本家ファイルアップローダー)

Last updated at Posted at 2017-07-21

はじめに

某所で、Rails5.2よりクラウドファイルストレージサービスへのアップロード機能が導入されると聞きました。
この機能はCarrierWave + fogの組み合わせでよく実装するので、楽になったらいいなぁと思い、(多分)来年リリースの新機能ではありますがリポジトリを眺めてみた結果のチラ裏です。

DHHもアナウンスしていますね。見落としていました

Active Storageとは

AWS S3やGoogle Cloud Storageなどのクラウドファイルストレージサービスへのアップロードをシンプルにやってくれる仕組みとのこと。
もちろん物理的なディスクシステムへ保存することもできるけど、主眼はあくまでクラウドサービスに置いているらしい。

※ お断り
以下は、もりもり開発している途中のコードを眺めて書き散らしたチラ裏です。
Active Storageに関する日本語記事がほぼなかったので、これくらいでもお役に立てるかなと思い公開しています。
記事執筆時点から仕様が変わる可能性はありますので、あらかじめご了承ください。

使用準備

インストール

application.rbrequire 'active_storage'を追加する

config/application.rb
require 'rails/all'
+ require 'active_storage'

その後、インストールコマンドを実行する。

$ rails activestorage:install

実行後、記事執筆時点では次のようになるみたいです。

  • storageディレクトリが生える
    • /storage
    • /tmp/storage
  • 設定ファイル出現
    • /config/storage_services.yml
  • マイグレーションファイル出現
    • db/yyymmddhhmmss_active_storage_create_tables.rb

設定ファイル

クラウドファイルストレージサービスの鍵やバケットなどの情報を記述しておくとこです。
秘匿情報は、Rails 5.1から導入されたEncrypted Secrets機能を使っていますね。

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

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

# Use rails secrets:edit to set the AWS secrets (as shared:aws:access_key_id|secret_access_key)
amazon:
  service: S3
  access_key_id: <%= Rails.application.secrets.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.secrets.dig(:aws, :secret_access_key) %>
  region: us-east-1
  bucket: your_own_bucket

# Remember not to checkin your GCS keyfile to a repository
google:
  service: GCS
  project: your_project
  keyfile: <%= Rails.root.join("path/to/gcs.keyfile") %>
  bucket: your_own_bucket

mirror:
  service: Mirror
  primary: local
  mirrors: [ amazon, google ]

スキーマ

ここは意識しなくても良いところですが、内部的に使われるテーブルが二つ生えます。
それぞれ、BlobモデルとAttachmentモデルで使われます。

db/yyymmddhhmmss_active_storage_create_tables.rb
class ActiveStorageCreateTables < ActiveRecord::Migration[5.1] # :nodoc:
  def change
    create_table :active_storage_blobs do |t|
      t.string   :key
      t.string   :filename
      t.string   :content_type
      t.text     :metadata
      t.integer  :byte_size
      t.string   :checksum
      t.datetime :created_at

      t.index [ :key ], unique: true
    end

    create_table :active_storage_attachments do |t|
      t.string  :name
      t.string  :record_gid
      t.integer :blob_id

      t.datetime :created_at

      t.index :record_gid
      t.index :blob_id
      t.index [ :record_gid, :name ]
      t.index [ :record_gid, :blob_id ], unique: true
    end
  end
end

使い方

has_one_attachedメソッドで使用したいプロパティ1を引数にとって定義する。

app/models/user.rb
class User < ApplicationRecord
  has_one_attached :avatar
end

これでActive Storageが用意したメソッドを使うことができる。

# attachメソッドでアップロード
user.avatar.attach io: File.open("~/face.jpg"), filename: "avatar.jpg", content_type: "image/jpg"
user.avatar.exist? # => true

# purgeメソッドで削除
user.avatar.purge
user.avatar.exist? # => false

# user.avatar.purge_laterで非同期削除もできるっぽい

有効期限が設定されたURLを発行することもできるようです

# 5分だけ有効なURL
user.avatar.url(expires_in: 5.minutes) # => /rails/blobs/<encoded-key>

その他、複数ファイルのアップロードも対応していますが、機能としては現時点でこれくらいのものでした。

まとめ

まだまだ開発中のようですが、アップロードだけであれば簡単にできそうな感じでした。

他の同種ライブラリのように、画像リサイズやサムネイル生成、拡張子のホワイトリスト/ブラックリスト機能はないようですので、まずはシンプルなアップロード要件から使っていこうかなという印象です。

Active Storageが同梱されるRails5.2リリースは通常であれば来年の春〜夏前です。
時間もまだまだありますので、この記事の内容はだいぶ変わると思います。
「そんな機能も入るんか」くらいのざっくりとした気持ちで頭の片隅に置いててください。

現場からは以上です。

  1. 仮想的に使うもので、マイグレーションで生やす必要はない(サンプルではavatar

37
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
23

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?