多文件上载ActiveAdmin集成

时间:2013-05-08 18:04:48

标签: ruby-on-rails ruby-on-rails-3 activerecord ruby-on-rails-3.2 activeadmin

我正在尝试创建一个包含3个模型的表单(1个用于实际表单,1个用于其他条目,另一个用于上载的存档)。我想使用jQuery File Upload gem将我的PDF上传到服务器,但我也使用处理此表单的ActiveAdmin gem。

如何创建多上传文件输入并通过我的文件模型在ActiveAdmin中添加?

我应该:

  • 验证文件是否为PDF
  • 验证他的尺寸
  • 将所有内容与表单一起提交(如果表单有错误,请不要上传,但要将文件保留在输入中)

1 个答案:

答案 0 :(得分:2)

对于包含多个上传的表单,您可以尝试:

# 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

另见:accept nested attributes for has_many relationship

使用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