Active Storage

参考:

Active Storage の概要 | Rails ガイド [公式]

Attachment

参考:

ActiveStorage::Attachment | Ruby on Rails [Official]

rails/attachment.rb at v6.0.0.rc1 · rails/rails – GitHub

Blob

参考:

ActiveStorage::Blob | Ruby on Rails API [Official]

rails/blob.rb at v6.0.0.rc1 · rails/rails – GitHub

Attached

参考:

ActiveStorage::Attached | Ruby on Rails [Official]

ActiveStorage::Attached::Macros | Ruby on Rails [Official]

ActiveStorage::Attached::One | Ruby on Rails [Official]

ActiveStorage::Attached::Many | Ruby on Rails [Official]

rails/model.rb at v6.0.0.rc1 · rails/rails – GitHub

Service

参考:

ActiveStorage::Service | Ruby on Rails [Official]

セットアップ

ActiveStorage をセットアップする。

$ rails active_storage:install

データベースのマイグレーションを実行する。

$ rails db:migrate

参考:

セットアップ | Rails ガイド [公式]

使い方

モデルでリレーションを宣言する。

class User < ApplicationRecord
  has_one_attached :avatar
end

フォームで添付したファイルをレコードに関連付ける。

user.avatar.attach(params[:avatar])

ローカルのファイルを直接レコードに関連付ける。

user.avatar.attach(
  io:           File.open("/path/to/face.jpg"),
  filename:     "face.jpg",
  content_type: "image/jpg"
)

参考:

Active Storage の使い方 – Qiita

Active Storage で添付した画像ファイルのピクセル情報を取得する – Qiita

AWS S3 を使って Heroku で画像を投稿できるようにする方法 – Qiita

ActiveStorage を使った複数画像アップロードアプリを作る | kykt35’s diary

How to use ActiveStorage in your Rails 5.2+ application | Blog de Capsens

導入

参考:

Active Storage + S3 による添付ファイル機能を試してみる – Qiita

ActiveStorage を使ってお手軽にファイルアップロードを試す – Qiita

Active Storage を試してみる | Misoca 開発者ブログ

Active Storage を試してみた | ゆっくり前に

ActiveStorage の仕組み (図あり) と使ってみてわかったこと – Qiita

has_one_attached / has_many_attached

参考:

has_one_attached – ActiveStorage::Attached::Macros | Ruby on Rails API [Official]

has_many_attached – ActiveStorage::Attached::Macros | Ruby on Rails API [Official]

has_one_attached – rails/model.rb at v6.0.0.rc1 · rails/rails – GitHub

has_many_attached – rails/model.rb at v6.0.0.rc1 · rails/rails – GitHub

attach

参考:

attach – ActiveStorage::Attached::One | Ruby on Rails API [Official]

attach – ActiveStorage::Attached::Many | Ruby on Rails API [Official]

attach – rails/one.rb at v6.0.0.rc1 · rails/rails – GitHub

attach – rails/many.rb at v6.0.0.rc1 · rails/rails – GitHub

images.attach results in InvalidSignature error – Stack Overflow

attached?

データが添付されているかどうかを返す。

@user.avatar.attached?

参考:

ActiveStorage::Attached::One | Ruby on Rails API [Official]

detach

参考:

detach – ActiveStorage::Attached::One | Ruby on Rails API [Official]

detach – ActiveStorage::Attached::Many | Ruby on Rails API [Official]

url_for

<%= link_to "Avatar", url_for(user.avatar) %>

参考:

添付ファイルへのリンク | Rails ガイド [公式]

Ruby on Rails Active Storage how to change host for url_for | EquiValent

Ruby on Rails Active Storage how to change host for url_for | RubyFlow

How to get url of Active Storage image – Stack Overflow

Errors when trying to display an image from ActiveStorage in Rails 5.2 – Stack Overflow

service_url

参考:

service_url – ActiveStorage::Blob | Ruby on Rails API [Official]

service_urls_expire_in / url_expires_in

参考:

How can I get image url from an ActiveStorage attachment in a worker? · Issue #31581 · rails/rails – GitHub

ActiveStorage::Blob::Representable

参考:

ActiveStorage::Blob::Representable | Ruby on Rails API [Official]

rails/representable.rb at 5-2-stable · rails/rails – GitHub

variant

リサイズしたオブジェクトの URL を返す。

avatar.variant(resize: "100x100").processed.service_url

画像をリサイズしたオブジェクトの image タグを生成する。

<%= image_tag user.avatar.variant(resize: "100x100") %>

参考:

variant – ActiveStorage::Blob::Representable | Ruby on Rails API [Official]

ActiveStorage::Variant | Ruby on Rails API [Official]

variant – rails/representable.rb at v5.2.3 · rails/rails – GitHub

preview

動画や PDF のプレビューオブジェクトを生成して URL を返す。

blob.preview(resize: "100x100").processed.service_url

プレビュー画像を表示する。

<%= image_tag video.preview(resize: "100x100") %>

参考:

非画像ファイルのプレビュー | Rails ガイド [公式]

preview – ActiveStorage::Blob::Representable | Ruby on Rails API [Official]

preview – rails/representable.rb at v5.2.3 · rails/rails – GitHub

representation

preview もしくは variant のどちらかを生成して URL を返す。

blob.representation(resize: "100x100").processed.service_url

参考:

representation – ActiveStorage::Blob::Representable | Ruby on Rails API [Official]

representation – rails/representable.rb at v5.2.3 · rails/rails – GitHub

metadata

参考:

metadata – ActiveStorage::Analyzer::ImageAnalyzer | Ruby on Rails API [Official]

metadata – rails/image_analyzer.rb at v5.2.3 · rails/rails – GitHub

Metadata about blobs stored with ActiveStorage with Rails 5+ – Stack Overflow

with_attached_*

参考:

has_one_attached – ActiveStorage::Attached::Macros | Ruby on Rails API [Official]

has_many_attached – ActiveStorage::Attached::Macros | Ruby on Rails API [Official]

with_attached_#{name} (has_one_attached) – rails/model.rb at v6.0.0.rc1 · rails/rails – GitHub

with_attached_#{name} (has_many_attached) – rails/model.rb at v6.0.0.rc1 · rails/rails – GitHub

How do you solve N+1 for ActiveStorage URLs? – Stack Overflow

フォームで使用する

複数のファイルを添付できる入力フィールドを生成する。

<%= form.file_field :images, multiple: true %>

コントローラーで複数のファイルに対応したパラメーターを許可する。

params.require(:post).permit(
  :message,
  images: []
)

参考:

Active Storage の使い方 – Qiita

file_field – ActionView::Helpers::FormBuilder | Ruby on Rails API [Official]

ダイレクトアップロード

アセットパイプラインに activestorage.js を含める。

//= require activestorage.js

もしくは Webpacker から使う場合は、モジュールを明示的に読み込んでスタートさせる。

import * as ActiveStorage from 'activestorage'
ActiveStorage.start()

参考:

Active Storage の Direct Upload を試した | Yoshiyuki Hirano

サービスに直接アップロードする – Active Storage の概要 – Rails ガイド [公式]

Direct uploads – rails/activestorage at master · rails/rails – GitHub

rails/activestorage.js at v5.2.2 · rails/rails – GitHub

upload

upload(key, io, checksum: nil)

参考:

upload – ActiveStorage::Service | Ruby on Rails API [Official]

URL から画像を保存する

uri          = URI.parse(image_url)
io           = uri.open
filename     = uri.path.split("/").last
content_type = io.content_type

user.avatar.attach(
  io:           io,
  filename:     filename,
  content_type: content_type
)

参考:

How to save an image from a url with rails active storage? – Stack Overflow

purge

参考:

How do I create a delete button for images uploaded with Active Storage – GoRails

エンジンから使う

main_app の URL ヘルパーを使う。

<%= image_tag main_app.url_for(@user.avatar) %>

もしくは、ApplicationHelperattachment_url 及び attachment_path を定義すると、直接 image_tagurl_for が使えるようになる。

module MyEngine
  module ApplicationHelper
    def attachment_url(*args)
      main_app.url_for(*args)
    end
    alias attachment_path attachment_url
  end
end
<%= image_tag @user.avatar %>
<%= link_to url_for(@user.avatar) %>

参考:

Can’t resolve image into URL when using ActiveStorage in mountable Engine · Issue #31325 · rails/rails – GitHub

Errors when trying to display an image from ActiveStorage in Rails 5.2 – Stack Overflow

rails_blob_url / rails_blob_path

ビュー外で Blob URL を生成するために使用する URL ヘルパー。ヘルパーを使用したいモジュールで Rails.application.routes.url_helpersinclude する。

フル URL を生成する場合は default_url_options[:host] を設定する必要がある。もしくは、ホスト指定なしの相対パスを生成する場合は、生成時にオプションとして only_path: true を指定する。

参考:

Ruby on Rails Active Storage how to change host for url_for | EquiValent

How can I get image url from an ActiveStorage attachment in a worker? · Issue #31581 · rails/rails – GitHub

ActiveStorage with Rails API · Issue #32500 · rails/rails – GitHub

Activestorrage service_url missing default_url_options[:host] · Issue #32866 · rails/rails – GitHub

How can i get url of my attachment stored in active storage in my rails controller – Stack Overflow

attachment_changes

未保存の添付データを保持するハッシュ

参考:

attachment_changes – rails/model.rb at v6.0.0.rc1 · rails/rails – GitHub

ActiveStorage::Blob::Analyzable

参考:

ActiveStorage::Blob::Analyzable | Ruby on Rails API [Official]

rails/analyzable.rb at 5-2-stable · rails/rails – GitHub

ActiveStorage::Analyzer::ImageAnalyzer

参考:

ActiveStorage::Analyzer::ImageAnalyzer | Ruby on Rails API [Official]

ActiveStorage::Filename

サニタイズされたファイル名を取得する。

ActiveStorage::Filename.new("foo/bar:baz.jpg").to_s
# => "foo-bar-baz.jpg"

参考:

rails/filename.rb at v6.0.0.rc1 · rails/rails – GitHub

Preview

参考:

ActiveStorage::Preview | Ruby on Rails API [Official]

rails/preview.rb at 5-2-stable · rails/rails – GitHub

ActiveStorage::Variation

参考:

ActiveStorage::Variation | Ruby on Rails API [Official]

ActiveStorage::PurgeJob

参考:

ActiveStorage::PurgeJob | Ruby on Rails API [Official]

仕組み

参考:

Rails 5.2 から入った ActiveStorage のソースコードを読んでみた | Rails Webook

ActiveStorage の挙動を調べる | Simple is Beautiful.

Some notes on what’s going on in ActiveStorage | Bibliographic Wilderness

Tips

参考:

7 Practical Tips for ActiveStorage on Rails 5.2 | kinopyo

Missing host to link to エラー

URL 生成時に、リンク先として必要なホスト情報が不足している旨のエラーが発生する。

ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

原因:

フル URL を生成するためのホスト情報が不足している。

対処法:

アプリケーションの設定でdefault_url_options[:host] を指定する。もしくは、URL 生成時に only_path: true を指定する。

参考:

Rails で Missing host to link to! が出たときに。model 内で URL 組み立てる場合の設定 – Qiita

Ruby on Rails Active Storage how to change host for url_for | EquiValent

ArgumentError – rails/url.rb at v5.2.3 · rails/rails – GitHub

Active Storage を使わない

新しいプロジェクトを作成する場合に Active Storage を含めない。

$ rails new App --skip-active-storage

既存のプロジェクトから Active Storage を取り除くには、config/application.rbrequire "rails/all" を次のコードに置き換えて、active_storage/engine と action_text/engine を取り除く。

require "rails"

%w(
  active_record/railtie
  #active_storage/engine
  action_controller/railtie
  action_view/railtie
  action_mailer/railtie
  active_job/railtie
  action_cable/engine
  action_mailbox/engine
  rails/test_unit/railtie
  sprockets/railtie
).each do |railtie|
  begin
    require railtie
  rescue LoadError
  end
end

config/environments/*.rb から設定を取り除く。

# config.active_storage.service = :local

app/assets/javascripts/application.js から activestorage を取り除く。(5.2 以前)

// require activestorage

参考:

Removing Active Storage Routes from Rails 5.2 | Mike Rogers

rails/all.rb at v6.0.0.beta1 · rails/rails – GitHub

Disable Active Storage in Rails 5.2 – Stack Overflow

タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です