1

3 つのモデル (実際のフォーム用に 1 つ、他のエントリ用に 1 つ、アップロードされたアーカイブ用に 1 つ) を持つフォームを作成しようとしています。jQuery File Upload gem を使用して PDF をサーバーにアップロードしたいのですが、このフォームを処理する ActiveAdmin gem も使用しています。

マルチアップロード ファイル入力を作成し、それを ActiveAdmin 内のファイル モデルを介して追加するにはどうすればよいですか?

私が持っている必要があります:

  • ファイルが PDF かどうかを検証します
  • 彼のサイズを検証します
  • フォームと一緒にすべてを送信します (フォームにエラーがある場合は、アップロードせずに入力内のファイルを保持してください)。
4

1 に答える 1

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

参照: 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 には、PDF ドキュメントであることを検証できる extension_white_list メソッドがあります。

 # uploaders/my_uploader.rb
 def extension_white_list
   %w(pdf jpg jpeg gif png csv )
 end
于 2013-05-10T05:56:09.783 に答える