ペーパークリップは非推奨になりました。
新しいプロジェクトの場合は、Rails 独自の ActiveStorage をお勧めします。
既存のプロジェクトについては、RailsConf 2019 で録画されたビデオとして英語、スペイン語で利用できる移行ガイドを参照して貢献してください。 Doorkeeper が使用する代替の移行チュートリアルを好む場合もあります。
あるいは、既存のプロジェクトについては、Kreeti が Paperclip の継続的なフォークである kt-paperclip を保守しています。
問題はディスカッション フォーラムとしてのみオープンなままにしておきます。問題に関する当社からの返答は保証されません。すべてのバグレポートは kt-paperclip に送信してください。
移行ガイドに対するプル リクエストを除き、プル リクエストは受け付けなくなりました。他のすべてのプル リクエストはマージせずに閉じられます。
master
ブランチに有効なドキュメント使用しているペーパークリップのバージョンのドキュメントを確認してください: https://github.com/thoughtbot/paperclip/releases
要件
RubyとRails
画像処理プロセッサ
file
インストール
クイックスタート
モデル
移行
編集ビューと新しいビュー
シンプルなフォームによる編集ビューと新しいビュー
コントローラ
ビューヘルパー
ファイルの存在を確認する
添付ファイルの削除
使用法
検証
国際化 (I18n)
セキュリティの検証
デフォルト
移行
添付ファイル列をテーブルに追加する
スキーマ定義
ヴィンテージ構文
ストレージ
ストレージを理解する
IOアダプター
後処理
カスタム添付ファイル プロセッサ
イベント
URIの難読化
チェックサム/フィンガープリント
論理的な削除のためのファイルの保存
動的構成
ダイナミックスタイル:
動的プロセッサ:
ロギング
導入
アタッチメントのスタイル
テスト
貢献する
ライセンス
思考ボットについて
Paperclip は、ActiveRecord 用の簡単なファイル添付ライブラリとして意図されています。その背後にある目的は、セットアップをできるだけ簡単にし、ファイルを他の属性とできるだけ同じように扱うことでした。これは、ActiveRecord::Base#save が呼び出されるまで、それらはディスク上の最終的な場所に保存されず、nil に設定されている場合は削除されないことを意味します。必要に応じて、サイズと存在に基づいて検証を管理します。必要に応じて、割り当てられた画像をサムネイルに変換できます。また、前提条件は ImageMagick をインストールするだけで済みます (最新の Unix ベースのシステムの場合、適切なパッケージをインストールするのと同じくらい簡単です)。添付ファイルはファイル システムに保存され、わかりやすい仕様によってブラウザで参照されます。この仕様には、合理的で便利なデフォルト値が設定されています。
詳細なオプションについては、 Paperclip::ClassMethods
のhas_attached_file
のドキュメントを参照してください。
完全な RDoc はオンラインです。
Paperclip には、Ruby バージョン>= 2.1および Rails バージョン>= 4.2が必要になりました (Ruby on Rails で Paperclip を使用する場合のみ)。
ImageMagick がインストールされており、Paperclip がそれにアクセスできる必要があります。これを確実に行うには、コマンド ラインで、 which convert
(ImageMagick ユーティリティの 1 つ) を実行します。これにより、そのユーティリティがインストールされているパスがわかります。たとえば、 /usr/local/bin/convert
が返される場合があります。
次に、環境設定ファイルで、そのディレクトリをパスに追加して、Paperclip にそこを参照するように指示します。
開発モードでは、次の行をconfig/environments/development.rb)
に追加します。
Paperclip.options[:command_path] = "/usr/local/bin/"
Mac OS X を使用している場合は、Homebrew で次のコマンドを実行します。
brew install imagemagick
PDF のアップロードを処理している場合、またはテスト スイートを実行している場合は、GhostScript もインストールする必要があります。 Mac OS X では、Homebrew を使用してインストールすることもできます。
brew install gs
Ubuntu (または任意の Debian ベース Linux ディストリビューション) を使用している場合は、apt-get で次のコマンドを実行するとよいでしょう。
sudo apt-get install imagemagick -y
file
コンテンツ タイプのチェックには Unix file
コマンドが必要です。このユーティリティは Windows では使用できませんが、Ruby Devkit にバンドルされているため、Windows ユーザーは devkit がインストールされ、システムPATH
に追加されていることを確認する必要があります。
手動インストール
開発環境として Windows 7 以降を使用している場合は、 file.exe
アプリケーションを手動でインストールする必要がある場合があります。 Paperclip 4+ のfile spoofing
システムはこれに依存しています。動作しない場合は、 Validation failed: Upload file has an extension that does not match its contents.
エラー。
手動でインストールするには、次の手順を実行する必要があります。
この URL から
file
ダウンロードしてインストールします
テストするには、以下の画像を使用できます。
次に、環境と統合する必要があります。できればPATH
変数を使用するか、 config/environments/development.rb
ファイルを変更してください。
パス
1. Click "Start" 2. On "Computer", right-click and select "Properties" 3. In Properties, select "Advanced System Settings" 4. Click the "Environment Variables" button 5. Locate the "PATH" var - at the end, add the path to your newly installed `file.exe` (typically `C:Program Files (x86)GnuWin32bin`) 6. Restart any CMD shells you have open & see if it works
または
環境
1. Open `config/environments/development.rb` 2. Add the following line: `Paperclip.options[:command_path] = 'C:Program Files (x86)GnuWin32bin'` 3. Restart your Rails server
これらの方法のいずれかを使用すると、Rails セットアップにfile.exe
機能へのアクセスが許可され、ファイルの内容を確認できるようになります (スプーフィングの問題を修正します)。
Paperclip は gem として配布されており、アプリ内でそのように使用する必要があります。
Gemfile に gem を含めます。
gem "ペーパークリップ"、"~> 6.0.0"
または、最新のものを取得したい場合は、メインのペーパークリップ リポジトリからマスターを取得できます。
gem "ペーパークリップ"、git: "git://github.com/thoughtbot/paperclip.git"
最新リリースの gem には含まれていないように見えるが、この README には記載されている機能を使用しようとしている場合、それらを使用したい場合は、おそらく master ブランチを指定する必要があります。この README を GitHub で読んでいる場合、この README はおそらく最新リリース バージョンよりも先に書かれています。
Rails 以外で使用する場合:
class ModuleName < ActiveRecord::Base include Paperclip::Glue ...終わり
class User < ActiveRecord::Base has_attached_file :avatar、styles: { Medium: "300x300>"、thumb: "100x100>" }、default_url: "/images/:style/missing.png" validates_attachment_content_type :avatar、content_type: / Aimage/.*z/end
users
テーブルがあると仮定して、 users
テーブルにavatar
列を追加します。
class AddAvatarColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down delete_attachment :users, :avatar endend
(または、Rails 移行ジェネレーターを使用することもできます: rails generate paperclip user avatar
)
コントローラーに対応するメソッドがあることを確認してください。
<%= form_for @user, url: users_path, html: { multipart: true } do |form| %> <%= form.file_field :avatar %> <%= form.submit %><% end %>
<%= simple_form_for @user、url: users_path do |form| %> <%= form.input :avatar、as: :file %> <%= form.submit %><% end %>
def create @user = User.create(user_params)endprivate# 属性のホワイトリストには Strong_parameters を使用します# create() および update() コントローラー メソッドを必ず更新してください。def user_params params.require(:user).permit(:avatar)end
画像を表示したいビューにこれらを追加します。
<%= image_tag @user.avatar.url %><%= image_tag @user.avatar.url(:medium) %><%= image_tag @user.avatar.url(:thumb) %>
ファイルが存在するかどうかを確認するには、次の 2 つの方法があります。
file?
そしてpresent?
_file_name
フィールドが入力されているかどうかを確認します
exists?
ファイルが存在するかどうかを確認します (クラウドに保存されている場合は TCP 接続を実行します)
ループ内にファイルが存在するかどうかを確認する場合は、このことに留意してください。最初のバージョンはパフォーマンスが大幅に向上していますが、セマンティクスが異なります。
属性をnil
に設定して保存します。
@user.avatar = [email protected]
Paperclip の基本は非常に単純です。has_attached_file メソッドを使用してモデルにhas_attached_file
ファイルがあることを宣言し、それに名前を付けます。
Paperclip は最大 4 つの属性をラップし (すべての属性にそのアタッチメントの名前が接頭辞として付けられるため、必要に応じてモデルごとに複数のアタッチメントを持つことができます)、それらにフレンドリーなフロントエンドを提供します。これらの属性は次のとおりです。
デフォルトでは、Paperclip が動作するには
のみが必要です。コンテンツ タイプの検証を使用する場合は、
を追加する必要があります。
has_attached_file
に渡されるオプションの詳細については、 Paperclip::ClassMethods
のドキュメントを参照してください。
検証のために、Paperclip では添付ファイルを検証するためのいくつかのバリデーターを導入しています。
AttachmentContentTypeValidator
AttachmentPresenceValidator
AttachmentSizeValidator
使用例:
検証:avatar、attachment_presence: truevalidates_with AttachmentPresenceValidator、属性: :avatarvalidates_with AttachmentSizeValidator、属性: :avatar、less_than: 1.メガバイト
バリデーターは、古いヘルパー スタイルを使用して定義することもできます。
validates_attachment_presence
validates_attachment_content_type
validates_attachment_size
使用例:
validates_attachment_presence :アバター
最後に、 validates_attachment
を使用して単一の添付ファイルに対して複数の検証を定義することもできます。
validates_attachment :avatar、プレゼンス: true、content_type: "image/jpeg"、サイズ: { in: 0..10.kilobytes }
注: 検証に従って添付ファイルが有効でない場合、後処理は開始されません。コールバックとプロセッサは、有効な添付ファイルを使用してのみ呼び出されます。
class Message < ActiveRecord::Base has_attached_file :asset,styles: { サム: "100x100#" } before_post_process :skip_for_audio def Skip_for_audio ! %w(audio/ogg application/ogg).include?(asset_content_type) endend
割り当て順序に依存する他の検証がある場合は、その後まで添付ファイルの割り当てを禁止し、手動で割り当てることをお勧めします。
class Book < ActiveRecord::Base has_attached_file :document,styles: { sumnail: "60x60#" } validates_attachment :document, content_type: "application/pdf" validates_something_else # Paperclip のsendclass と競合するその他の検証 BooksController < ApplicationController def create @book = Book.new(book_params) @book.document = params[:book][:document] @book.save Reply_with @book end private def book_params params.require(:book).permit(:title, :author) endend
content_type の検証とセキュリティに関するメモ
ファイルが明示的にサポートしたい MIME タイプのみであることを確認する必要があります。 そうしないと、ユーザーが悪意のある HTML ペイロードを含むファイルをアップロードした場合に、XSS 攻撃にさらされる可能性があります。
画像のみに興味がある場合は、許可される content_types を画像関連のものに制限します。
validates_attachment :avatar、content_type: ["image/jpeg"、"image/gif"、"image/png"]
Paperclip::ContentTypeDetector
ファイルの実際の内容に関係なく、ファイルの拡張子を推測された content_type と照合しようとします。
さまざまな言語のロケール ファイルを使用または追加する場合は、プロジェクト https://github.com/thoughtbot/paperclip-i18n を確認してください。
Egor Homakov からのレポートのおかげで、人々が Content-Type を偽装し、予期しないデータがサーバーに取得されるのを防ぐための措置を講じました。
注: バージョン 4.0.0 以降では、すべての添付ファイルに content_type 検証または file_name 検証を含めるか、どちらも持たないことを明示する必要があります。これを行わないと、 Paperclip でエラーが発生します。
class ActiveRecord::Base has_attached_file :avatar # コンテンツ タイプを検証します validates_attachment_content_type :avatar, content_type: /Aimage/ # ファイル名を検証します validates_attachment_file_name :avatar、一致します: [/pngz/, /jpe?gz/] # 明示的に一致しませんvalidate do_not_validate_attachment_file_type :avatarend
これにより、Paperclip はデフォルトで安全に保たれ、ファイルシステムをいじろうとする人を防ぐことができます。
注: また、バージョン 4.0.0 以降、Paperclip にはオフにできない別の検証が追加されました。この検証により、コンテンツ タイプのスプーフィングが防止されます。つまり、(たとえば) PHP ドキュメントを、整形式の JPEG の EXIF タグの一部としてアップロードします。このチェックはメディア タイプ (MIME タイプの最初の部分、つまりtext/plain
の 'text') に限定されます。これにより、HTML ドキュメントが JPEG としてアップロードされることは防止されますが、GIF が.jpg
拡張子でアップロードされることは防止されません。この検証では、フォームに検証エラーが追加されるだけです。エラーが発生することはありません。
これにより、カスタム ファイル拡張子を使用するアプリケーションで誤った検証エラーが発生する場合があります。このような場合は、 config/initializers/paperclip.rb
を作成して、カスタム拡張子をコンテンツ タイプ マッピングのリストに追加できます。
# MIME タイプが「text/plain」のファイルの拡張子として「.foo」を許可します。Paperclip.options[:content_type_mappings] = { foo: %w(text/plain)}
すべての Paperclip 添付ファイルのグローバル デフォルトは、Paperclip::Attachment.default_options ハッシュを変更することで定義できます。これは、例ごとにデフォルトのストレージ設定を設定する場合に便利で、すべてのhas_attached_file
定義でそれらを定義する必要がなくなります。
Rails を使用している場合は、 config/application.rb
または config.paperclip_defaults のいずれかのconfig/environments/*.rb
ファイルでデフォルトのオプションを使用してハッシュを定義できます。これらは、Rails アプリの起動時にPaperclip::Attachment.default_options
にマージされます。例:
module YourApp class Application < Rails::Application # その他のコード... config.paperclip_defaults = { storage: :fog, Fog_credentials: { Provider: "Local", local_root: "#{Rails.root}/public"}, Fog_directory: ""、fog_host: "localhost"} endend
もう 1 つのオプションは、 Paperclip::Attachment.default_options
ハッシュを直接変更することです。この方法は、Rails 以外のアプリケーションで機能するか、Paperclip のデフォルト設定をイニシャライザに置きたい場合のオプションです。
Rails イニシャライザの例は次のようになります。
Paperclip::Attachment.default_options[:storage] = :fogPaperclip::Attachment.default_options[:fog_credentials] = { Provider: "Local", local_root: "#{Rails.root}/public"}Paperclip::Attachment.default_options[ :霧_ディレクトリ] = ""ペーパークリップ::Attachment.default_options[:fog_host] = "http://localhost:3000"
Paperclip では、モデル内に必要な列を作成するために使用できるいくつかの移行メソッドが定義されています。これを支援するヘルパー メソッドには次の 2 種類があります。
attachment
ヘルパーは、テーブルの作成時に使用できます。
class CreateUsersWithAttachments < ActiveRecord::Migration def up create_table :users do |t| t.attachment :avatar end end # これは、Paperclip 添付ファイルに users テーブルのみを使用していることを前提としています。慎重に落としてください! def down drop_table :users endend
以下に示すように、上記のup
のdown
の代わりに、 change
メソッドを使用することもできます。
class CreateUsersWithAttachments < ActiveRecord::Migration def change create_table :users do |t| t.attachment :アバター終了endend
あるいは、 add_attachment
とremove_attachment
メソッドを使用して、新しい Paperclip 列を既存のテーブルに追加することもできます。
class AddAttachmentColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down delete_attachment :users, :avatar endend
または、 change
メソッドを使用してこれを行うこともできます。
class AddAttachmentColumnsToUsers < ActiveRecord::Migration def change add_attachment :users, :avatar endend
古い構文 ( t.has_attached_file
やdrop_attached_file
など) は Paperclip 3.x でも引き続きサポートされていますが、この新しい構文を使用するように移行ファイルを更新することをお勧めします。
ペーパークリップには 3 つのストレージ アダプターが付属しています。
ファイルストレージ
S3 ストレージ ( aws-sdk-s3
経由)
フォグストレージ
Paperclip を別のストレージで使用したい場合は、Paperclip と一緒にこれらの gem をインストールできます。
ペーパークリップ-紺碧
ペーパークリップ-Azure-ストレージ
ペーパークリップドロップボックス
添付ファイルとして割り当てられるファイルは、デフォルトでは、 has_attached_file
の:path
オプションで指定されたディレクトリに配置されます。デフォルトでは、この場所は:rails_root/public/system/:class/:attachment/:id_partition/:style/:filename
です。この場所が選択された理由は、標準の Capistrano デプロイメントでは、 public/system
ディレクトリをアプリの共有ディレクトリにシンボリックリンクできるため、デプロイメント間でディレクトリが存続することを意味します。たとえば、 :path
使用すると、次の場所にファイルが存在する可能性があります。
/data/myapp/releases/20081229172410/public/system/users/avatar/000/000/013/small/my_pic.png
注: これは Paperclip の以前のバージョンからの変更ですが、全体的にはデフォルトのファイル ストアとしてより安全な選択です。
Amazon の S3 サービスを使用してファイルを保存することも選択できます。これを行うには、Gemfile にaws-sdk-s3
gem を含めます。
gem「aws-sdk-s3」
そして、 has_attached_file
から S3 を使用して指定できます。 S3 ストレージの構成と使用に関する詳細についてはPaperclip::Storage::S3
ドキュメントを参照してください。
ローカル ファイル システム (および Rails アプリのパブリック ディレクトリ) 上のファイルは、インターネット全体で利用できるようになります。アクセス制御が必要な場合は、ファイルを別の場所に置くことができます。ファイルが公開されないようにするには、 :path
と:url
オプションの両方を変更する必要があります。 :path
と:url
両方で、同じ補間変数セットを使用できます。
ファイルがアップロードまたは添付されるとき、そのファイルは、Rails の UploadFile オブジェクトから StringIO、Tempfile、あるいは画像を指す URL である単純な String まで、いくつかの異なる入力フォームのいずれかになります。
Paperclip は、デフォルトでこれらのソースの多くを受け入れます。また、少しの設定でさらに多くのことを処理できます。非ローカル ソースからのイメージを処理する IO アダプタは、デフォルトでは有効になっていません。これらは、次のような行をconfig/initializers/paperclip.rb
に追加することで有効にできます。
Paperclip::DataUriAdapter.register
リモート読み込みアダプターは、必要な場合にのみ有効にすることをお勧めします。そうしないと、誰かがそれをベクトルとして使用して内部ネットワーク構造を洞察できる可能性があります。
次のアダプターはデフォルトではロードされません。
Paperclip::UriAdapter
- URI
インスタンスを受け入れます。
Paperclip::HttpUrlProxyAdapter
- http
文字列を受け入れます。
Paperclip::DataUriAdapter
- Base64 でエンコードされたdata:
文字列を受け入れます。
Paperclip は、ポストプロセッサの拡張可能な選択をサポートしています。添付ファイルのスタイルのセットを定義する場合、デフォルトでは、それらの「スタイル」が実際には「サムネイル」であることが想定されます。これらはPaperclip::Thumbnail
によって処理されます。 下位互換性の理由から、次のように、単一のジオメトリ文字列、またはジオメトリとファイルの変換先の形式を含む配列を渡すことができます。
has_attached_file :avatar、スタイル: { サム: ["32x32#", :png] }
これにより、アップロードされた内容に関係なく、「親指」スタイルが PNG 形式の 32x32 の正方形に変換されます。形式が指定されていない場合は、同じ形式が維持されます (たとえば、JPG は JPG のままになります)。 Paperclip::Thumbnail
ImageMagick を使用して画像を処理します。 ImageMagick のジオメトリ ドキュメントには、受け入れられるスタイル形式に関する詳細情報が記載されています。
変換プロセスをさらにきめ細かく制御するには、 source_file_options
とconvert_options
使用して、フラグと設定を ImageMagick の強力な Convert ツールに直接渡すことができます (ここで説明します)。例えば:
has_attached_file :image, スタイル: { 通常: ['800x800>', :png]}, source_file_options: { 通常: "-密度 96 - 深度 8 - 品質 85" }、convert_options: { 通常: "-posterize 3"}
ImageMagick は、リソース制限を制御するための多くの環境変数をサポートしています。たとえば、アプリケーションのプロセス環境で次の変数を設定することで、メモリまたは実行時間の制限を強制できます。
MAGICK_MEMORY_LIMIT=128MiB
MAGICK_MAP_LIMIT=64MiB
MAGICK_TIME_LIMIT=30
変数と説明の完全なリストについては、ImageMagick のリソース ドキュメントを参照してください。
独自のカスタム添付プロセッサを作成して、透かしの追加、画像の圧縮、ファイルの暗号化などのタスクを実行できます。カスタム プロセッサはPaperclip
モジュール内で定義し、 Paperclip::Processor
( lib/paperclip/processor.rb
を参照) から継承し、 File
返すmake
メソッドを実装する必要があります。 Rails アプリのlib/paperclip
とlib/paperclip_processors
ディレクトリ内のすべてのファイルは、Paperclip によって自動的にロードされます。プロセッサーは、 has_attached_file
の:processors
オプションを使用して指定します。
has_attached_file :scan、スタイル: { テキスト: { 品質: :better } }、プロセッサ: [:ocr]
これにより、仮想クラスPaperclip::Ocr
ロードされ、アップロードされたファイルとともにオプション ハッシュ{ quality: :better }
が渡されます。
複数のプロセッサを指定でき、それらは:processors
配列で定義された順序で呼び出されます。後続の各プロセッサには、前のプロセッサからの結果が与えられます。すべてのプロセッサは、 :styles
ハッシュで定義された同じパラメータを受け取ります。 たとえば、次の定義があると仮定します。
has_attached_file :scan、スタイル: { テキスト: { 品質: :better } }、プロセッサ: [:rotator, :ocr]
:rotator
プロセッサと:ocr
プロセッサの両方がオプション{ quality: :better }
を受け取ります。プロセッサが認識しないオプションを受け取った場合、それを無視することが期待されます。
注: プロセッサは元の添付ファイルをスタイルに変換することによって動作するため、スタイルが定義されていない場合、プロセッサは実行されません。
サムネイルの幅、高さ、サイズをデータベースにキャッシュすることに興味がある場合は、paperclip-meta gem を見てください。
また、サムネイルをその場で生成することに興味がある場合は、attachment_on_the_fly gem を調べてみるとよいでしょう。
Paperclip のサムネイル ジェネレーター ( lib/paperclip/thumbnail.rb
を参照) はプロセッサとして実装されており、独自のプロセッサを作成する場合の良い参考になる可能性があります。
後処理ステップの前後に、Paperclip はいくつかのコールバックでモデルにコールバックし、モデルが処理ステップを変更またはキャンセルできるようにします。コールバックはbefore_post_process
とafter_post_process
(各添付ファイルの処理の前後に呼び出されます)、および添付ファイル固有のbefore_
とafter_
です。コールバックは、通常の ActiveRecord コールバックにできるだけ近づけることを目的としているため、 before_filter
で false を返す (具体的には、 nil を返すのは同じではありません) と、後処理ステップが停止します。 after_filter
で false を返しても何も停止しませんが、必要に応じてモデルと添付ファイルにアクセスできます。
注: 検証に従って添付ファイルが有効でない場合、後処理は開始されません。コールバックとプロセッサは、有効な添付ファイルを使用してのみ呼び出されます。
class Message < ActiveRecord::Base has_attached_file :asset,styles: { サム: "100x100#" } before_post_process :skip_for_audio def Skip_for_audio ! %w(audio/ogg application/ogg).include?(asset_content_type) endend
Paperclip には、公開されているファイルのファイル名を難読化するための:hash
と呼ばれる補間機能があります。
使用例:
has_attached_file :avatar, { url: "/system/:hash.:extension", hash_secret: "longSecretString"}
:hash
補間は、 :hash_data
で指定されたもので構成される一意のハッシュに置き換えられます。 :hash_data
のデフォルト値は":class/:attachment/:id/:style/:updated_at"
です。
:hash_secret
は必須です - : :hash_secret
存在しない状態で:hash
が使用されると例外が発生します。
この機能の詳細については、著者自身の説明をお読みください
割り当てられた元のファイルのチェックサムは、指紋という名前の属性がある場合、モデルに配置されます。 上記のユーザー モデルの移行例に従うと、移行は次のようになります。
class AddAvatarFingerprintColumnToUser < ActiveRecord::Migration def up add_column :users, :avatar_fingerprint, :string end def down delete_column :users, :avatar_fingerprint endend
アルゴリズムは構成オプションを使用して指定できます。 Paperclip 5 以前との下位互換性のため、デフォルトは MD5 です。
has_attached_file :some_attachment、adapter_options: { hash_digest: Digest::SHA256 }
既存の添付ファイルのダイジェストを変更した後、 CLASS=User ATTACHMENT=avatar rake paperclip:refresh:fingerprints
実行して、データベース内のフィンガープリントを更新します。
論理的に削除されたモデルをうまく動作させるために、添付ファイルを保存するオプションが利用可能です。 (パラノイアとしての行為、パラノイアなど)
has_attached_file :some_attachment、{preserve_files: true,}
これにより、モデルが破棄されたときにsome_attachment
消去されるのを防ぐことができるため、後でオブジェクトが復元されたときにも some_attachment が引き続き存在します。
呼び出し可能なオブジェクト (ラムダ、Proc) は、Paperclip 全体の動的構成のさまざまな場所で使用できます。 この戦略はライブラリの多くのコンポーネントに存在しますが、定義されたスタイルとプロセッサをすべてのインスタンスに適用するのではなく、カスタム スタイルとプロセッサを特定のモデル インスタンスに適用できる可能性が最も重要です。
ユーザーの役割に基づいてさまざまなスタイルを持つユーザー モデルを想像してください。おそらく一部のユーザーは上司であり (例: ユーザー モデル インスタンスは#boss?
に応答します)、通常のユーザーよりも大きなアバター サムネイルを表示する価値があります。ユーザーの役割に基づいてどのスタイル パラメーターを使用するかを決定する構成は次のようになります。上司は300x300
サムネイルを受け取り、それ以外の場合は100x100
サムネイルが作成されます。
class User < ActiveRecord::Base has_attached_file :avatar、styles: lambda { |attachment| { サム: (attachment.instance.boss? ? "300x300>" : "100x100>") } }end
もう 1 つの人為的な例は、( :styles
の定義時に呼び出される暗黙のthumbnail
プロセッサを超えて) どのファイル プロセッサを適用する必要があるかを認識するユーザー モデルです。おそらく、透かしプロセッサが利用可能であり、それは特定のモデルのアバターでのみ使用されます。 このための構成は、インスタンスにどのプロセッサを適用するかを照会する場所である可能性があります。おそらく、一部のユーザーはプロセッサに対して[:thumbnail, :watermark]
を返す可能性があります。この場合、Paperclip によってすでに定義されているthumbnail
プロセッサの後に、定義されたwatermark
プロセッサが呼び出されます。
class User < ActiveRecord::Base has_attached_file :avatar、プロセッサ: lambda { |instance| attr_accessor :processorsend
デフォルトでは、Paperclip はロガー レベルに従ってログを出力します。 (テスト中などに) ロギングを無効にしたい場合は、これを環境の設定に追加します。
Your::Application.configure do... Paperclip.options[:log] = false...end
詳細については Rdocs を参照してください
Capistrano のシンボリックリンクをpublic/system
ディレクトリに作成し、添付ファイルが新しいデプロイメントでも存続できるようにするには、 config/deploy.rb
ファイルでlinked_dirs
オプションを設定します。
セット:linked_dirs, fetch(:linked_dirs, []).push('public/system')
Paperclip は、以前のデプロイで追加された新しい添付スタイルを認識します。各デプロイ後に行う必要がある唯一のことはrake paperclip:refresh:missing_styles
を呼び出すことです。 デフォルトでは、現在の添付ファイル スタイルがRAILS_ROOT/public/system/paperclip_attachments.yml
に保存されます。次の方法で変更できます。
Paperclip.registered_attachments_styles_path = '/tmp/config/paperclip_attachments.yml'
Capistrano の例を次に示します。
名前空間 :paperclip do desc "不足しているペーパークリップ スタイルを構築" タスク :build_missing_styles ロールで実行 (:app) release_path 内で実行 Rails_env で実行: fetch(:rails_env) 実行 :rake, "paperclip:refresh:missing_styles" end end end endendafter( "deploy:compile_assets"、"paperclip:build_missing_styles")
新しいスタイルを追加するたびに、本番環境でサムネイルを忘れずに更新する必要がなくなりました。残念ながら、動的スタイルでは機能せず、無視されるだけです。
すでに動作するアプリがあり、 rake paperclip:refresh:missing_styles
で古い画像を更新したくない場合は、既存のスタイルについて Paperclip に指示する必要があります。 paperclip_attachments.yml
ファイルを手動で作成するだけです。例えば:
class User < ActiveRecord::Base has_attached_file :avatar,styles: { サム: 'x100', クロップ可能: '600x600>', big: '1000x1000>' }endclass Book < ActiveRecord::Base has_attached_file :cover,styles: { small: 'x100'、大: '1000x1000>' } has_attached_file :sample、styles: { サム: 'x100' }end
次に、 RAILS_ROOT/public/system/paperclip_attachments.yml
で次のようにします。
---:ユーザー: :アバター: - :親指 - :トリミング可能 - :big:本: :表紙: - :小さい - :大 :サンプル: - :親指
Paperclip は、添付ファイルをテストするための rspec 互換のマッチャーを提供します。詳細については、Paperclip::Shoulda::Matchers のドキュメントを参照してください。
並列テスト
Paperclip ストレージのデフォルトpath
のため、テストを並行して実行しようとすると、各テスト プロセスで同じパスが計算されるため、ファイルが上書きされる可能性があります。この修正は、Parallel_tests に対して機能しますが、テストを同時に実行するための他のメカニズムにも同様の概念を使用する必要があります。
if ENV['PARALLEL_TEST_GROUPS'] Paperclip::Attachment.default_options[:path] = ":rails_root/public/system/:rails_env/#{ENV['TEST_ENV_NUMBER'].to_i}/:class/:attachment/:id_partition/ :ファイル名"else Paperclip::Attachment.default_options[:path] = ":rails_root/public/system/:rails_env/:class/:attachment/:id_partition/:filename"end
ここで重要なのは、 ENV['TEST_ENV_NUMBER']
、または使用する並列テスト ライブラリに同様のメカニズムを含めることです。
結合テスト
FactoryBot で統合テストを使用すると、アプリ内にテスト ファイルのコピーが複数保存される場合があります。これを回避するには、次のようにconfig/environments/test.rb
でカスタム パスを指定します。
Paperclip::Attachment.default_options[:path] = "#{Rails.root}/spec/test_files/:class/:id_partition/:style.:extension"
次に、テスト スイートの実行後に、これをspec_helper.rb
に追加して、そのディレクトリを必ず削除してください。
config.after(:suite) do FileUtils.rm_rf(Dir["#{Rails.root}/spec/test_files/"])end
Factory Botを使用したテスト構成の例
FactoryBot.define do Factory :user do avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } endend
機能やバグ修正に貢献したい場合: ありがとうございます!修正/機能が含まれる可能性が高いことを確認するには、次のガイドラインをお読みください。
プルリクエストを投稿します。
テストがあることを確認してください!テストされていないパッチは受け入れられません。明示的なテストが必要ない場合はまれです。ペーパークリップのテストの作成について質問がある場合は、GitHub のイシューを開いてください。
テストの貢献と実行の詳細については、 CONTRIBUTING.md
参照してください。
貢献者の皆様、ありがとうございました!
ペーパークリップの著作権 © 2008-2017 thoughtbot, inc.これはフリー ソフトウェアであり、MIT-LICENSE ファイルに指定された条件に基づいて再配布できます。
Paperclip は thoughtbot によって維持され、資金提供されています。 thoughtbot の名前とロゴは thoughtbot, inc. の商標です。
私たちはオープンソース ソフトウェアが大好きです。当社の他のプロジェクトをご覧いただくか、製品の設計、開発、成長を当社に依頼してください。