我正在尝试创建一个具有 3 个模型的表单(1 个用于实际表单,1 个用于其他条目,另一个用于上传的档案)。我想使用 jQuery File Upload gem 将我的 PDF 上传到服务器,但我也在使用处理此表单的 ActiveAdmin gem。
如何创建多上传文件输入并通过 ActiveAdmin 中的文件模型添加它?
我应该:
- 验证文件是否为 PDF
- 验证他的大小
- 将所有内容与表单一起提交(如果表单有错误,请不要上传但将文件保留在输入中)
我正在尝试创建一个具有 3 个模型的表单(1 个用于实际表单,1 个用于其他条目,另一个用于上传的档案)。我想使用 jQuery File Upload gem 将我的 PDF 上传到服务器,但我也在使用处理此表单的 ActiveAdmin gem。
如何创建多上传文件输入并通过 ActiveAdmin 中的文件模型添加它?
我应该:
对于具有多个上传的表单,您可以尝试以下操作:
# active admin
form do |f|
f.inputs "ModelName" do
f.input :name
end
f.has_many :attachments do |ff|
ff.input :path
end
end
# your_model.rb
attr_accessible :attachments_attributes
has_many :attachments
# your_model.rb (add after relations)
accepts_nested_attributes_for :attachments, :allow_destroy => true
另请参阅:接受 has_many 关系的嵌套属性
如果未通过,使用 rails 验证器将阻碍表单的保存。
# attachment.rb
validates :check_size
validates :check_if_pdf
def check_size
errors.add :path, "Size is NOT ok" if self.size < XXX
end
def check_if_pdf
errors.add :path, "File is NOT pdf" unless self.path.to_s.split('.').last == 'pdf'
end
不确定 Paperclip ...... Carrierwave 也很棒,如果你对那个宝石持开放态度,你可以试试这个:
# attachment.rb
mount_uploader :path, MyUploader
# app/uploaders/my_uploader.rb
class MyUploader < CarrierWave::Uploader::Base
storage :file # For local storage
#storage :fog # If using S3
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
def filename
@name ||= "#{File.basename(original_filename, '.*')}" if original_filename.present?
end
end
Carrierwave 有一个 extension_white_list 方法,您可以尝试验证它是 PDF 文档
# uploaders/my_uploader.rb
def extension_white_list
%w(pdf jpg jpeg gif png csv )
end