回形针已被弃用。
对于新项目,我们推荐Rails 自己的ActiveStorage。
对于现有项目,请查阅并贡献迁移指南,该指南有英语版、西班牙语版以及在 RailsConf 2019 上录制的视频。您可能还更喜欢 Doorkeeper 使用的替代迁移教程。
另外,对于现有项目,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_attachment_content_type :avatar, content_type: / 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 # 与Paperclip的sendclass冲突的其他验证 BooksController < ApplicationController def create @book = 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/, /jpe?gz/] # 明确不这样做验证 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.options[:content_type_mappings] = { foo: %w(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}/public"},fog_directory: “”,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::Attachment.default_options[ :雾目录] = ""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_styles" end end end endendafter( “部署:compile_assets”,“回形针:build_missing_styles”)
现在,每次添加新样式时,您不必记住在生产中刷新缩略图。不幸的是,它不适用于动态样式 - 它只是忽略它们。
如果您已经有一个可用的应用程序并且不希望rake paperclip:refresh:missing_styles
刷新旧图片,则需要告诉 Paperclip 现有样式。只需手动创建一个paperclip_attachments.yml
文件即可。例如:
class User < ActiveRecord::Base has_attached_file :avatar, styles: {thumb: 'x100',croppable: '600x600>', big: '1000x1000>' }endclass Book < ActiveRecord::Base has_attached_file :cover, styles: { 小: '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/ :文件名"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. 的商标。
我们热爱开源软件!查看我们的其他项目或雇用我们来设计、开发和发展您的产品。