Active Storage
参考:
Active Storage の概要 | Rails ガイド [公式]
Attachment
参考:
ActiveStorage::Attachment | Ruby on Rails [Official]
rails/attachment.rb at 6-0-stable · rails/rails – GitHub
Blob
参考:
ActiveStorage::Blob | Ruby on Rails API [Official]
rails/blob.rb at 6-0-stable · 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/attached.rb at 6-0-stable · rails/rails – GitHub
rails/one.rb at 6-0-stable · rails/rails – GitHub
rails/many.rb at 6-0-stable · rails/rails – GitHub
Attached::Model
参考:
rails/model.rb at 6-0-stable · rails/rails – GitHub
Service
参考:
ActiveStorage::Service | Ruby on Rails [Official]
セットアップ
ActiveStorage
をセットアップする。
$ rails active_storage:install
データベースのマイグレーションを実行する。
$ rails db:migrate
参考:
使い方
モデルでリレーションを宣言する。
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
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
Rails 5.2 で追加予定の ActiveStorage を使ってみる | ユニファ開発者ブログ
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 · rails/rails – GitHub
has_many_attached – rails/model.rb at v6.0.0 · rails/rails – GitHub
attach
参考:
ActiveStorage で attach できるものについて調べてみた | RIT Tech Blog
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 · rails/rails – GitHub
attach – rails/many.rb at v6.0.0 · 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) %>
参考:
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_url – rails/blob.rb at v6.0.0 · rails/rails – GitHub
Direct link (no redirect) to files in ActiveStorage – Stack Overflow
Why not using service_url instead of blob/variant/preview url (302 redirect)? – Stack Overflow
service_urls_expire_in / url_expires_in
参考:
How do you change the Active Storage Service url_expires_in timeout? – Stack Overflow
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: [] )
参考:
file_field – ActionView::Helpers::FormBuilder | Ruby on Rails API [Official]
Best practice to retain/cache uploaded file when form redisplays – Stack Overflow
ダイレクトアップロード
アセットパイプラインに activestorage.js
を含める。
//= require activestorage.js
もしくは Webpacker から使う場合は、モジュールを明示的に読み込んでスタートさせる。
import * as ActiveStorage from 'activestorage' ActiveStorage.start()
参考:
Active Storage の Direct Upload を試した | Yoshiyuki Hirano
ActiveStorage で S3 にダイレクトアップロードする | Rails Webook
サービスに直接アップロードする | 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
Blob を複製する
参考:
How do I duplicate a file stored in ActiveStorage in Rails 5.2 – 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) %>
もしくは、ApplicationHelper
に attachment_url
及び attachment_path
を定義すると、直接 image_tag
や url_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) %>
参考:
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_helpers
を include
する。
フル URL を生成する場合は default_url_options[:host]
を設定する必要がある。もしくは、ホスト指定なしの相対パスを生成する場合は、生成時にオプションとして only_path: true
を指定する。
参考:
Ruby on Rails Active Storage how to change host for url_for | EquiValent
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
Open / download link – Stack Overflow
アクセス制限を行う
参考:
ActiveStorage のファイルにアクセスするときに自前の認証機構を経由させる – Qiita
download
参考:
Displaying, downloading and streaming files with Active Storage | Notes to self (nts.strzibny.name)
download – ActiveStorage::Blob | Ruby on Rails API [Official]
Get ActiveStorage blob as a blob – 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]
Attached::Changes::CreateMany
参考:
rails/create_many.rb at 6-0-stable · rails/rails – GitHub
ActiveStorage::RepresentationsController
参考:
Active Storage 利用時に Public URL な画像を利用する方法 – Qiita
Caching variants with ActiveStorage | Neon Tsunami
rails/representations_controller.rb at 6-0-stable · rails/rails – GitHub
ActiveStorage::BlobsController
参考:
rails/blobs_controller.rb at 6-0-stable · rails/rails – GitHub
仕組み
参考:
Rails 5.2 から入った ActiveStorage のソースコードを読んでみた | Rails Webook
ActiveStorage の挙動を調べる | Simple is Beautiful.
Some notes on what’s going on in ActiveStorage | Bibliographic Wilderness
保存せずに Attachment を置き換える
参考:
Impossible to reassign HasOneAssociation without saving · Issue #32886 · rails/rails – GitHub
replace – rails/has_one_association.rb at v5.2.3 · rails/rails – GitHub
target – rails/association.rb at v5.2.3 · rails/rails – GitHub
target= – rails/association.rb at v5.2.3 · rails/rails – GitHub
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.rb
の require "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