EPFL Extension SchoolではRuby on Railsを使用してwebアプリケーション開発を教えています。 これは、固体であり、試してみました-と-信頼され、web開発について学ぶあなたの最初のステップを取るときに簡単に従う構造を提示する素晴らしいフ
しかし、それはまた、毎年改善と新機能がリリースされて、ソフトウェアの絶えず進化している作品です。 バージョン5.2のRailsへの最近の追加の一つは、ActiveStorage機能であり、コアRailsフレームワークに簡単なファイルアップロード管理を初めて追加します。
webアプリケーション開発プログラムの最初の反復では、Railsアプリケーションにファイルアップロードを追加する方法を学ぶ主題が含まれています。 しかし、プログラムではRails5.1を使用していますが、ファイルアップロードの件名は、CarrierWaveと呼ばれるファイルアップロードを追加するために広く使用されて これは、railsアプリでファイルアップロードを実装することを可能にする堅実なサードパーティの宝石であり、学習者プラットフォームを含む多くの実世界のRuby on Railsアプリで使用されています。
しかし、ActiveStorageの導入により、これらのサードパーティの宝石は、Rails内にバンドルされたこの新しいソリューションよりも魅力的ではありません。 実際、他の人気のあるサードパーティ製のファイルアップロード宝石の一つであるPaperclipは、ActiveStorageを支持して廃止されたことをすでに発表しています。 Paperclipの開発者は、ActiveStorageが開発者にとってより良い選択であることを認識し、独自のgemのさらなる作業を停止しました。それでは、Rails5.1のCarrierWaveからRails5.2のActiveStorageに移行するために必要なものを具体的に見てみましょう。
アプリケーション
webアプリケーション開発プログラムでは、My Bucket Listというwebアプリケーションを構築しています。 これは、ユーザーが常に達成したいと思っていた経験を作成し、追跡することを可能にするアプリです。 ユーザーは、他の人が作成したものを見て、あまりにもそれらを追跡することができます。 アプリの機能の一つは、ユーザーが自分のアバターをアップロードすることができ、我々はCarrierWaveを使用してファイルのアップロードや添付ファイルについて学ぶた
を使用して、このフォームでアバターをアップロードすることができますので、最初に、CarrierWaveを使用して簡単な添付ファイルを追加することに関す
CarrierWave設定
プロジェクトにCarrierWaveを含めるには、次のようにする必要があります:
- CarrierWave gemを
Gemfile
に追加します。 - は、設定初期化子
config/initializers/carrierwave.rb
内にActiveRecord用のCarrierWaveアダプタを含めます。
そして、モデルに画像添付ファイルを追加するには、次のようにする必要があります:
rails generate uploader UploaderName
を使用してアップローダーを生成します。- モデルに属性を追加して、各レコードの添付ファイル名を保存し、関連するデータベース移行を行います。
- アップロードの保存場所やデフォルトの画像など、アップロード者の値を編集します。
- 特定のアップローダーを含めるには、モデル内の
mount_uploader
マクロを使用します。 - 画像をアップロードできるファイルフォームフィールドを追加します。
- fileフィールドを含むフォームを処理するコントローラーの強力なパラメーターのリストにmodel属性を追加します。CarrierWaveでは、添付ファイルを持つ必要があるモデルに特定の属性を追加する必要があります。 たとえば、
avatar
イメージを添付する必要があるUser
モデルには、String
である:avatar
という属性が必要です。 これには、基になるデータベース列を追加するためのデータベース移行に加えて、モデル内のその属性にUploader
クラスを作成してマウントする必要があります。これは特に面倒ではありませんが、ActiveStorageはケースバイケースではるかに少ないコードを必要とします。
もう一つ強調すべき点は、私のアプリであるMy Bucket Listアプリでは、CarrierWave avatar uploaderがデフォルトの単純なファイルストレージで設定されていることです。 順番に、アップロードされた画像は、アプリケーションの
public/
フォルダ内のどこかに保存されます。 その正確なパスは、アバターのUploader
クラス内で定義され、"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
に設定されます。 これはpublic/
フォルダに対する相対パスであるため、アップロードされた画像はwebサーバーを介して直接アクセスできます。 これにより、添付ファイルへの直接アクセスが可能になり、後でActiveStorageと対比することができます。Railsのアップグレード
ActiveStorageを見る前に、Rails5.2にアップグレードする必要があります。 これは、アプリケーションの複雑さに応じて、かなり複雑になる可能性のあるタスクです。 私がここで使用しているアプリケーションは、WADプログラムで構築していますが、更新するのは特に難しくありませんが、それでも注意と注意が必要で私のバケットリストアプリケーションをRails5.1からRails5.2に更新するために私がしたことは次のとおりです。
最初に、私はアップグレードを分離するために私のgitリポジトリに新しいブランチを作成しました—アップグレードプロセスで何かがゆがんでしまった場合、アプリの以前の作業バージョンに戻ることができることが重要です!新しいブランチで、
Gemfile
のRailsのバージョンを'~> 5.1.2'
から'~> 5.2.0'
に変更し、bin/bundle update rails
を実行しました—このコマンドは、新しいバージョンのrails
とアプリケーション内のすべての関連 私のアプリケーションでは、gemの競合はありませんでしたが、サードパーティのgemを使用している場合は、この時点で異なるgemバージョン間の競合を解決す新しいRails gemとその依存関係をインストールした後、アプリケーション自体を更新する必要があります。 私は
bin/bundle exec rails app:update
を使ってこれをしました。 このコマンドは、Rails5.2で動作するように、アプリケーション内の必要なすべてのファイルをプログラムで更新します。しかし…このコマンドは、
config/routes.rb
などのアプリケーションに加えた変更を上書きします。 幸いなことに、コマンドは各ファイルを上書きするかどうかを尋ね、このプロセス中にdiff
これらのファイルのいずれかが上書きされるかどうかを 各上書きのプロンプトはです。:
-
Y
“はい、私のファイルを上書きする”の場合、Enter
を押すだけの場合のデフォルトオプションです。 n
“いいえ、ファイルを上書きしないでください”-
a
“はい、このファイルを上書きし、他のすべてのファイルも上書きします!”. (私の一般的なルールは決してa
を使用しません)。 q
“このプロセスを終了します”の場合”-
d
“自分のファイルと上書きの違いを表示する”の場合” -
h
“Ynaqdh
の意味のリストを表示する”の場合”
私のアプリケーションでは、
config/routes.rb
とconfig/locales/en.yml
を除くY
で各上書きを受け入れました。 これら2つのファイルは私が変更したファイルだったので、私は自分のバージョンを維持したいので、n
を選択しました。このアップグレードプロセスは、より複雑なアプリケーションがある場合、特に環境設定ファイルに多くのカスタム設定がある場合、より複雑にな
config/environments/production.rb
、config/environments/test.rb
、およびconfig/environments/development.rb
。 アップグレードはこれらのファイルに重要な設定を追加しますが、独自のカスタム設定を維持することもできます—これは、別のgitブランチにアプリケーシ その後、この古いブランチのコードで、アップグレード後にすべてのアプリケーションコードと構成がまだ配置されていることを確認できます。bin/bundle exec rails app:update
を実行した後、bootsnap
宝石をGemfile
に追加する必要がありました。 これはRails5.2で使用されている新しいgemですが、app:upgrade
コマンドの一部として追加されていません。 だから私はちょうどgem 'bootsnap'
をGemfile
に追加してからbin/bundle install
を実行しました。この後、私のバケットリストアプリケーションは
rails server
を使用する前と同じように起動しました。CarrierWaveをActiveStorage
に置き換えるので、アプリケーションがRails5.2で実行されているので、CarrierWaveをActiveStorageに置き換えることができます。ActiveStorageでは、CarrierWaveで必要な添付ファイル名を格納するためにモデル固有の属性を追加する必要はありません。 ActiveStorageは、すべての添付ファイルに対して同じ2つの関連テーブルで動作します。これらの2つのテーブルを設定するために、私は実行しました
bin/bundle exec rails active_storage:install
その後にrails db:migrate
。 2つのテーブルはactive_storage_blobs
とactive_storage_attachments
で、1つ目は添付ファイルの詳細、2つ目は添付ファイルをモデルレコードにリンクするポリモーフィック結合テーブルです。これらの2つのテーブルを作成したら、モデルに添付ファイルを含めるために他の移行を作成する必要はありません! これにより、ActiveStorageはデータベースの観点から簡単に操作できます。次に、
:avatar
添付ファイルの実装をCarrierWaveではなくActiveStorageに置き換えることを検討しました。 私のアプリでは、各User
には:avatar
があります。 以前はCarrierWaveを使用していたため、:avatar
属性をUser
モデルのCarrierWaveUploader
にマウントし、次のように宣言しました:class User < ApplicationRecord
# ... various codez mount_uploader :avatar, AvatarUploader # ... other codez
endCarrierWave
:avatar
添付ファイルは、次のようにhas_one_attached :avatar
を使用してActiveSupport添付ファイルに置き換えることができます:class User < ApplicationRecord
# ... various codez # commented old uploader for reference
# mount_uploader :avatar, AvatarUploader
has_one_attached :avatar # ... other codez
endこれは1行のコードへの変更です。 この時点で、他に何をする必要がありますか? たとえば、アップロードの保存場所はどのように設定されていますか? 私のアプリでは、CarrierWave avatar uploaderはデフォルトの単純なファイルストレージで設定されており、この場所は
avatar_uploader.rb
ファイルで明示的に設定されていることに注意して 単純なファイルストレージもActiveStorageのデフォルトです。 この場所はconfig/storage.yml
ファイル内で設定され、ローカルアップロードのデフォルト値が設定されます。ActiveStorageのデフォルト設定は、アプリケーションの変更された:avatar
属性に対してアップロードが機能するためのコードを記述する必要がないことを意味します。 アップロードメカニズムをCarrierWaveからActiveStorageに完全に変更しましたが、これ以上何もする必要はありません::avatar
はすでに強力なパラメータとして宣言されているため、アップロードを管理するコントローラに変更を加える必要はありません。 また、これは:avatar
“属性”によってサポートされているため、ユーザーがアップロードする画像を選択できるようにするビューのファイルフォームフィールドを変更する必しかし、CarrierWaveからActiveStorageに移行するために必要な変更がもう1つあり、それがビューで添付された画像を使用する方法です。 CarierWaveでは、avatar_url
メソッドを使用してフルイメージパスをレンダリングしました。 ActiveStorageでは、ファイルURLはattachment属性自体からレンダリングされるのではなく、ヘルパーメソッドに属性を渡すことによってレンダリングされます。 したがって、完全な添付URLはurl_for(user.avatar)
を使用してレンダリングするか、image_tag
で直接レンダリングすることができます。添付ファイルが存在するかどうかを明示的に確認する必要があるため、ビューでの完全な使用法は次のようになります:
<% if current_user.avatar.attached? %>
<%= image_tag current_user.avatar, class: 'avatar' %>
<% else %>
<%= image_tag 'default-avatar', class: 'avatar' %>
<% end %>上記のようなスニペットを使用してビューの
user.avatar_url
への参照を更新すると、すべての新しいアップロードのためにCarrierWaveからActiveStorageに完全に移動しました。古いCarrierWaveコードを整理する必要があり、CarrierWaveで行われた既存のアップロードをどうするかについての質問があります。 しかし、それについては以下を参照してください…
より複雑なシナリオ
ほとんどすべての本番シナリオは、私が上で概説したものよりも複雑になります。 アップロードがCdnやAWS S3のようなリモートサーバーに保存されていることや、サムネイルの画像サイズ変更などを考慮する必要があります。 ActiveStorageは、私たちも箱から出してそれらのことの多くを行うことができ、非常によく開発者のニーズのために設計されているようです。 ご想像のとおり、Railsガイドには良いドキュメントがあります。
既存のアップロードをCarrierWaveからActiveStorageに移行することに関しては、これは比較的小さなrakeスクリプトで確実に可能です。 私は将来の記事でそれをカバーすることを目指します。
これは単純なシナリオでしたが、全体的にActiveStorageを利用してCarrierWaveを置き換えるのがいかに簡単かに本当に満足していました。 私はまた、ActiveStorageのさまざまな部分に入った考えが好きです。 私は間違いなくあなたのアプリケーションでファイルアップロードにActiveStorageを使用するためにRails5.2に入る価値があると思います!
詳しくはこちら!
RubyとRuby on Railsについての詳細を学ぶことに興味がありますか? 私は、データサイエンス、webアプリケーション開発などのデジタルスキルを教える認定されたオンライン学習プラットフォームであるEPFL Extension SchoolでWebアプリケー EPFLは世界有数の大学の1つであり、Times Higher Education Rankingによって「No.1Young University」にランクされています。
-