回形針已被棄用。
對於新項目,我們推薦Rails 自己的ActiveStorage。
對於現有項目,請查閱並貢獻遷移指南,該指南有英文版、西班牙語版以及在 RailsConf 2019 上錄製的影片。
另外,對於現有項目,Kreeti 正在維護 kt-paperclip,這是 Paperclip 的一個正在進行的分支。
我們將保留這些問題,僅作為討論論壇。我們不保證我們會在這些問題中做出回應。所有錯誤報告都應發送至 kt-paperclip。
除了針對遷移指南的拉取請求外,我們不再接受拉取請求。所有其他拉取請求將在不合併的情況下關閉。
master
分支有效的文檔請檢查您正在使用的回形針版本的文件:https://github.com/thoughtbot/paperclip/releases
要求
Ruby 和 Rails
影像處理器
file
安裝
快速入門
型號
遷移
編輯和新視圖
使用簡單的表單編輯和新視圖
控制器
查看助手
檢查文件是否存在
刪除附件
用法
驗證
國際化 (I18n)
安全驗證
預設值
遷移
將附件列新增至表中
模式定義
復古文法
貯存
了解儲存
IO 適配器
後處理
自訂附件處理器
活動
URI混淆
校驗和/指紋
軟刪除的檔案保存
動態配置
動態風格:
動態處理器:
記錄
部署
附件樣式
測試
貢獻
執照
關於thinkbot
Paperclip 旨在作為 ActiveRecord 的簡單文件附件庫。背後的目的是使設定盡可能簡單,並儘可能像對待其他屬性一樣對待文件。這意味著它們不會保存到磁碟上的最終位置,如果設定為 nil,它們也不會被刪除,直到呼叫 ActiveRecord::Base#save 為止。如果需要,它會根據大小和存在來管理驗證。如果需要,它可以將指定的圖像轉換為縮圖,並且先決條件就像安裝 ImageMagick 一樣簡單(對於大多數現代基於 Unix 的系統來說,就像安裝正確的軟體包一樣簡單)。附加文件保存到文件系統中,並透過易於理解的規範在瀏覽器中引用,該規範具有合理且有用的預設值。
有關更詳細的選項,請參閱Paperclip::ClassMethods
中的has_attached_file
文件。
完整的 RDoc 已上線。
Paperclip 現在需要 Ruby 版本>= 2.1和 Rails 版本>= 4.2 (只有當您要將 Paperclip 與 Ruby on Rails 結合時)。
必須安裝 ImageMagick 並且 Paperclip 必須有權存取它。為了確保它確實如此,請在命令列上執行which convert
(ImageMagick 實用程式之一)。這將為您提供該實用程式的安裝路徑。例如,它可能返回/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 分發,這就是它應該在您的應用程式中使用的方式。
將 gem 包含在您的 Gemfile 中:
gem "回形針", "~> 6.0.0"
或者,如果您想要取得最新版本,可以從主回形針儲存庫取得 master:
gem“回形針”,git:“git://github.com/thoughtbot/paperclip.git”
如果您嘗試使用最新發布的 gem 中似乎沒有的功能,但本 README 中提到了這些功能,那麼您可能需要指定 master 分支(如果您想使用它們)。如果您在 GitHub 上閱讀此自述文件,它可能會領先於最新發布的版本。
對於非 Rails 使用:
類別 ModuleName < ActiveRecord::Base 包括 Paperclip::Glue ……結尾
class User < ActiveRecord::Base has_attached_file :avatar, styles: {medium: "300x300>",thumb: "100x100>" }, default_url: "/images/:style/missing.png" validates_. Aimage/.*z/end
假設您有一個users
表,在users
表上新增一個avatar
欄位:
類別 AddAvatarColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar endend
(或者您可以使用Rails遷移產生器: rails generate paperclip user avatar
)
確保您的控制器中有相應的方法:
<%= form_for @user, url: users_path, html: { multipart: true } do |form| %> <%= form.file_field :頭像 %> <%= 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) %>
檢查文件是否存在有兩種方法:
file?
並present?
檢查_file_name
欄位是否已填充
exists?
檢查檔案是否存在(如果儲存在雲端,將執行 TCP 連線)
如果您要檢查文件是否存在於循環中,請記住這一點。第一個版本的性能明顯更高,但具有不同的語義。
將屬性設為nil
並儲存。
@user.avatar = [email protected]
Paperclip 的基礎知識非常簡單:使用has_attached_file
方法聲明您的模型有一個附件,並為其命名。
Paperclip 將包裝最多四個屬性(所有屬性都以該附件的名稱為前綴,因此如果您願意,每個模型可以有多個附件)並為它們提供友好的前端。這些屬性是:
預設情況下,回形針操作時只需要
。如果您想要使用內容類型驗證,則需要新增
。
有關傳遞給has_attached_file
的選項的更多信息,請參閱Paperclip::ClassMethods
的文檔。
對於驗證,Paperclip 引入了幾個驗證器來驗證您的附件:
AttachmentContentTypeValidator
AttachmentPresenceValidator
AttachmentSizeValidator
用法範例:
驗證:avatar,attachment_presence:truevalidates_with AttachmentPresenceValidator,屬性::avatarvalidates_with AttachmentSizeValidator,屬性::avatar,小於:1.megabytes
驗證器也可以使用舊的幫助器樣式來定義:
validates_attachment_presence
validates_attachment_content_type
validates_attachment_size
用法範例:
validates_attachment_presence :頭像
最後,您也可以使用validates_attachment
對單一附件定義多個驗證:
validates_attachment :頭像,存在:true,content_type:“image/jpeg”,大小:{ in:0..10.kilobytes }
注意:如果根據驗證附件無效,後處理甚至不會開始。您的回呼和處理器只會使用有效的附件來呼叫。
class Message < ActiveRecord::Base has_attached_file :asset, styles: {thumb: "100x100#" } before_post_process :skip_for_audio defskip_for_audio ! %w(音訊/ogg 應用程式/ogg).include?(asset_content_type) endend
如果您有其他依賴分配順序的驗證,建議的操作過程是阻止分配附件,直到之後,然後手動分配:
class Book < ActiveRecord::Base has_attached_file :document, styles: {thumbnail: "60x60#" } validates_attachment :document, content_type: "application/pdf" validates_something_else #Paperclips 的其他驗證 App Book.new(book_params) @book.document = params[:book][:document] @book.save respond_with @book end private def book_params params.require(:book).permit(:title, :author) endend
關於 content_type 驗證和安全性的說明
您應該確保驗證文件僅是您明確想要支援的 MIME 類型。 如果不這樣做,當使用者上傳帶有惡意 HTML 負載的檔案時,您可能會受到 XSS 攻擊。
如果您只對映像感興趣,請將允許的 content_types 限制為 image-y 類型:
validates_attachment:頭像,content_type:[“圖片/ jpeg”,“圖片/ gif”,“圖片/ png”]
Paperclip::ContentTypeDetector
將嘗試將檔案的副檔名與推斷的 content_type 進行匹配,而不管檔案的實際內容如何。
若要使用或新增不同語言的區域設定文件,請檢查專案 https://github.com/thoughtbot/paperclip-i18n。
感謝 Egor Homakov 的報告,我們已採取措施防止人們欺騙內容類型並獲取您不期望的資料到您的伺服器上。
注意:從版本 4.0.0 開始,所有附件都需要包含 content_type 驗證、file_name 驗證,或明確聲明它們不會包含其中任何一個。如果您不這樣做,回形針將引發錯誤。
class ActiveRecord::Base has_attached_file :avatar # 驗證內容型別validates_attachment_content_type :avatar, content_type: /Aimage/ # 驗證檔案名稱 validates_attachment_file_name :avatar, matches: [/pngz/validates_attachment_file_name :avatar, mats:[/pngz/validates, /jpe這樣做驗證 do_not_validate_attachment_file_type :avatarend
預設情況下,這可以保證 Paperclip 的安全,並防止人們試圖破壞您的檔案系統。
注意:同樣從版本 4.0.0 開始,Paperclip 還有另一個無法關閉的驗證。此驗證將防止內容類型欺騙。也就是說,上傳 PHP 文件(例如)作為格式良好的 JPEG 的 EXIF 標籤的一部分。此檢查僅限於媒體類型(MIME 類型的第一部分,即text/plain
中的“text”)。這將阻止 HTML 文件以 JPEG 格式上傳,但不會阻止以.jpg
副檔名上傳 GIF。此驗證只會將驗證錯誤新增至表單。它不會導致出現錯誤。
這有時會導致使用自訂檔案副檔名的應用程式出現錯誤的驗證錯誤。在這些情況下,您可能想要透過建立config/initializers/paperclip.rb
將自訂擴充功能新增至內容類型對應清單:
# 允許「.foo」作為 MIME 類型「text/plain」的檔案的副檔名。
可以透過更改 Paperclip::Attachment.default_options 雜湊來定義所有 Paperclip 附件的全域預設值。這對於設定每個範例的預設儲存設定非常有用,因此您不必在每個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}/publicdi"},fog_rectory:fog_root:rectory: “”,fog_host:“localhost”}結束
另一個選擇是直接修改Paperclip::Attachment.default_options
哈希 - 此方法適用於非 Rails 應用程序,或者如果您希望將 Paperclip 預設值放在初始值設定項中,則可以選擇此方法。
Rails 初始值設定項範例如下所示:
Paperclip::Attachment.default_options[:storage] = :fogPaperclip::Attachment.default_options[:fog_credentials] = { 提供者: "Local", local_root: "#{Rails.root}/public"}Paperclip::Aopttments.default_ [ :fog_directory] = ""Paperclip::Attachment.default_options[:fog_host] = "http://localhost:3000"
Paperclip 定義了多種遷移方法,可用於在模型中建立必要的欄位。有兩種類型的輔助方法可以幫助實現這一點,如下所示:
建立表格時可以使用attachment
助手:
class CreateUsersWithAttachments < ActiveRecord::Migration def up create_table :users do |t| t.attachment :avatar end end # 假設您只使用使用者表進行回形針附件。小心掉落! def down drop_table :使用者結束
也可以使用change
方法,取代上面的up
/ down
組合,如下圖:
class CreateUsersWithAttachments < ActiveRecord::Migration def Change create_table :users do |t| t.attachment :頭像結束endend
或者,可以使用add_attachment
和remove_attachment
方法將新的 Paperclip 欄位新增到現有表中:
類別 AddAttachmentColumnsToUsers < ActiveRecord::Migration def up add_attachment :users, :avatar end def down remove_attachment :users, :avatar endend
或者您可以使用change
方法來執行此操作:
類別 AddAttachmentColumnsToUsers < ActiveRecord::Migration def 更改 add_attachment :users, :avatar endend
Paperclip 3.x 中仍然支援老式語法(例如t.has_attached_file
和drop_attached_file
),但建議您更新這些遷移檔案以使用此新語法。
回形針附帶 3 個儲存適配器:
文件儲存
S3 儲存(透過aws-sdk-s3
)
霧存儲
如果您想將回形針與其他儲存裝置一起使用,您可以將這些寶石與迴紋針一起安裝:
迴紋針-天藍色
回形針-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 服務儲存檔案。為此,請將aws-sdk-s3
gem 包含在您的 Gemfile 中:
寶石'aws-sdk-s3'
然後您可以從has_attached_file
指定使用 S3 。您可以在Paperclip::Storage::S3
文件中找到有關配置和使用 S3 儲存的更多資訊。
本機檔案系統(以及 Rails 應用程式的公共目錄中)上的檔案將可供整個 Internet 使用。如果您需要存取控制,可以將文件放在不同的位置。您需要更改:path
和:url
選項,以確保這些文件不對公眾開放。 :path
和:url
都允許使用相同的插值變數集。
上傳或附加檔案時,它可以採用幾種不同的輸入形式之一,從 Rails 的 UploadedFile 物件到 StringIO 再到 Tempfile,甚至是指向映像的 URL 的簡單字串。
預設情況下,Paperclip 將接受其中許多來源。只需很少的配置,它就能處理更多的事情。預設情況下,不啟用處理非本地來源影像的 IO 適配器。可以透過在config/initializers/paperclip.rb
中新增類似下列內容的行來啟用它們:
回形針::DataUriAdapter.register
最好僅在需要時才啟用遠端載入適配器。否則,有人可能會利用它作為向量來深入了解您的內部網路結構。
預設不載入以下適配器:
Paperclip::UriAdapter
- 接受URI
實例。
Paperclip::HttpUrlProxyAdapter
- 接受http
字串。
Paperclip::DataUriAdapter
- 接受 Base64 編碼的data:
字串。
Paperclip 支援可擴充的後處理器選擇。當您為附件定義一組樣式時,預設情況下,這些「樣式」實際上是「縮圖」。這些由Paperclip::Thumbnail
處理。 出於向後相容性的原因,您可以傳遞單一幾何字串或包含幾何圖形和檔案將轉換為的格式的數組,如下所示:
has_attached_file :頭像, 樣式: { 拇指: ["32x32#", :png] }
無論上傳什麼內容,這都會將「拇指」樣式轉換為 PNG 格式的 32x32 方塊。如果未指定格式,則保持不變(例如,JPG 仍為 JPG)。 Paperclip::Thumbnail
使用 ImageMagick 處理影像; ImageMagick 的幾何文件提供了有關可接受的樣式格式的更多資訊。
為了對轉換過程進行更細粒度的控制,可以使用source_file_options
和convert_options
將標誌和設定直接傳遞到ImageMagick強大的轉換工具,記錄在此。例如:
has_attached_file :image, styles: { 常規: ['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 :掃描,樣式:{ 文字:{ 品質::更好 } },處理器:[:ocr]
這將載入假設的類別Paperclip::Ocr
,並將選項雜湊{ quality: :better }
以及上傳的檔案傳遞給它。
可以指定多個處理器,並且將按照:processors
數組中定義的順序呼叫它們。每個後續處理器都會收到前一個處理器的結果。所有處理器都接收相同的參數,這些參數在:styles
雜湊中定義。 例如,假設我們有這樣的定義:
has_attached_file :掃描,樣式:{ 文字:{ 品質::更好 } },處理器:[:旋轉器,:ocr]
:rotator
處理器和:ocr
處理器都會收到選項{ quality: :better }
。如果處理器收到一個它無法識別的選項,則預計會忽略它。
注意:由於處理器透過將原始附件轉換為樣式來執行,因此如果沒有定義樣式,則不會執行任何處理器。
如果您有興趣在資料庫中快取縮圖的寬度、高度和大小,請查看回形針元 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: {thumb: "100x100#" } before_post_process :skip_for_audio defskip_for_audio ! %w(音訊/ogg 應用程式/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 remove_column :users, :avatar_fingerprint endend
可以使用配置選項指定演算法;它預設為 MD5,以便向後相容於 Paperclip 5 及更早版本。
has_attached_file :some_attachment,adapter_options:{ hash_digest:摘要::SHA256 }
更改現有附件的摘要後執行CLASS=User ATTACHMENT=avatar rake paperclip:refresh:fingerprints
更新資料庫中的指紋。
可以選擇保留附件,以便與軟刪除模型很好地配合。 (表現得偏執、偏執等)
has_attached_file :some_attachment, {preserve_files: true,}
這將防止模型被破壞時some_attachment
被清除,因此當稍後恢復物件時它仍然存在。
可呼叫物件(lambda、Procs)可以在整個 Paperclip 中的許多地方用於動態配置。 該策略存在於庫的許多元件中,但最重要的是允許將自訂樣式和處理器應用於特定模型實例,而不是在所有實例上應用定義的樣式和處理器。
想像一個根據使用者角色具有不同樣式的使用者模型。也許某些用戶是老闆(例如,用戶模型實例響應#boss?
)並且值得比普通用戶更大的頭像縮圖。根據使用者角色決定要使用哪些樣式參數的配置可能如下所示,其中老闆將收到300x300
縮圖,否則將建立100x100
縮圖。
類別 User < ActiveRecord::Base has_attached_file :avatar, styles: lambda { |attachment| { 大拇指: (attachment.instance.boss? ? "300x300>" : "100x100>") } }end
另一個人為的例子是使用者模型,它知道應該應用哪些檔案處理器(除了定義:styles
時呼叫的隱含thumbnail
處理器之外)。也許我們有一個可用的水印處理器,但它僅用於某些型號的頭像。 此配置可能是查詢實例以了解應套用哪些處理器的位置。據推測,某些用戶可能會為其處理器返回[:thumbnail, :watermark]
,其中在 Paperclip 已定義的thumbnail
處理器之後調用定義的watermark
處理器。
類別 User < ActiveRecord::Base has_attached_file :avatar, 處理器: lambda { |instance|實例.處理器} attr_accessor :processorsend
預設情況下,Paperclip 根據您的記錄器等級輸出日誌記錄。如果您想要停用日誌記錄(例如在測試期間),請將其新增至您的環境配置:
您的::Application.configure 做... 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 在roles(:app) 上執行在release_path 中執行使用rails_env: fetch(:rails_env) 執行:rake, "paperclip:refresh:missing_s" endendafter( “部署:compile_assets”,“迴紋針:build_missing_styles”)
現在,每次新增樣式時,您不必記住在生產中刷新縮圖。不幸的是,它不適用於動態樣式 - 它只是忽略它們。
如果您已經有一個可用的應用程式並且不希望rake paperclip:refresh:missing_styles
刷新舊圖片,則需要告訴 Paperclip 現有樣式。只需手動建立一個paperclip_attachments.yml
檔案即可。例如:
。 'x100',大:'1000x1000>'} has_attached_file:樣本,樣式:{拇指:'x100'}end
然後在RAILS_ROOT/public/system/paperclip_attachments.yml
:
---:用戶: :頭像: - :拇指 - :可裁剪 - :大:書::封面: - :小的 -:大:樣本: - :拇指
Paperclip 提供與 rspec 相容的匹配器來測試附件。有關詳細信息,請參閱 Paperclip::Shoulda::Matchers 上的文件。
平行測試
由於回形針儲存的預設path
,如果您嘗試並行運行測試,您可能會發現檔案被覆蓋,因為在每個測試進程中都會為它們計算相同的路徑。雖然此修復適用於平行測試,但類似的概念應該用於並發運行測試的任何其他機制。
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/ :filename"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 工廠 :user do avatar { File.new("#{Rails.root}/spec/support/fixtures/image.jpg") } endend
如果您想貢獻功能或錯誤修復:謝謝!為了確保您的修復/功能有很高的機會被包含,請閱讀以下指南:
發布拉取請求。
確保有測試!我們不會接受任何未經測試的補丁。這是非常罕見的不需要明確測試的情況。如果您對編寫回形針測試有疑問,請開啟 GitHub 問題。
請參閱CONTRIBUTING.md
以了解有關貢獻和運行測試的更多詳細資訊。
感謝所有貢獻者!
Paperclip 版權所有 © 2008-2017thoughtbot, inc.它是免費軟體,可以根據 MIT-LICENSE 文件中指定的條款重新分發。
Paperclip 由thoughtbot 維護和資助。 Thoughtbot 的名稱和標誌是 Thoughtbot, Inc. 的商標。
我們熱愛開源軟體!查看我們的其他項目或僱用我們來設計、開發和發展您的產品。