Rails3でトンボを使用して複数の画像をアップロードしようとしていました。いくつかのチュートリアルを検索しましたが、見つかりませんでした。Carrierwave で複数の画像をアップロードするためのチュートリアルを見つけましたが、トンボで運を見つけることができませんでした..何か助けてください :)
1 に答える
序文
Dragonfly自体は、 paperclipと同様に、一般的にプロジェクトのメディアを管理するために使用できます。質問自体は、レールアプリケーション内での複数ファイルのアップロードに要約されます。このトピックに関するいくつかのチュートリアルが利用可能で、Dragonfly を使用してモデルに特定のファイルを保存するために簡単に適用できます。それらを調べて、プロジェクトに適応させることをお勧めします。
ただし、現在開発中の Rails 3.2 アプリ用に作成した最小限の例を提示できます。これは完全ではありませんが (検証処理など)、いくつかの出発点を提供できます。
例
参考までに、基本的な考え方はここから引用します。この例は Rails 3.2.x で行われています。
休暇データベースがあり、ユーザーが休暇に関する旅行レポートを作成できるとします。彼らは小さな説明といくつかの写真を残すかもしれません。
旅行用の単純な ActiveRecord ベースのモデルを構築することから始めます。今はそれTrip
を呼び出してみましょう。
class Trip < ActiveRecord::Base
has_many :trip_images
attr_accessible :description, :trip_images
end
ご覧のとおり、has_many
関連付けを介してモデルに旅行の画像が添付されています。TripImage
コンテンツ フィールドにファイルを格納するためにトンボを使用するモデルを簡単に見てみましょう。
class TripImage < ActiveRecord::Base
attr_accessible :content, :trip_id
belongs_to :trip_id
image_accessor :content
end
トリップ画像自体は添付ファイルとして保存されます。このモデル内に、ファイル サイズや MIME タイプなどの制限を設けることができます。
andアクションTripController
を持つ を作成しましょう(必要に応じて scaffolding を介してこれを生成できます。これは決して特別なことではありません)。new
create
class TripController < ApplicationController
def new
@trip = Trip.new
end
def create
@trip = Trip.new(params[:template])
#create the images from the params
unless params[:images].nil?
params[:images].each do |image|
@trip.trip_images << TripImages.create(:content => image)
end
if @trip.save
[...]
end
end
params
ハッシュ以外の別のエントリから画像を作成することを除いて、ここでは特別なことは何もありません。new.html.erb
これは、テンプレート ファイル内のファイル アップロード フィールド (またはTrip
モデルのフィールドに使用する部分ファイル)を見ると理にかなっています。
[...]
<%= f.file_field :trip_images, :name => 'images[]', :multiple => true %>
[...]
これは当面は機能するはずですが、現時点では画像に制限はありません。モデルのカスタム バリデーターを使用して、サーバー側で画像の数を制限できます。Trip
class Trip < ActiveRecord::Base
has_many :trip_images
attr_accessible :description, :trip_images
validate :image_count_in_bounds, :on => :create
protected
def image_count_in_bounds
return if trip_images.blank?
errors.add("Only 10 images are allowed!") if trip_images.length > 10
end
end
これはあなたに任せますが、ファイルフィールドでクライアント側の検証を使用することもできます。一般的な考え方は、ファイルフィールドを変更したときにファイルをチェックすることです(CoffeeScriptで):
jQuery ->
$('#file_field_id').change () ->
#disable the form
for file in this.files
#check each file
#enable the form
概要
ファイルのアップロードだけに関しては、トンボは他のソリューションとそれほど異なる動作をしないため、既存のチュートリアルから多くを構築できます。ただし、より手の込んだものが必要な場合は、他の多くの人が私の前に持っているように、 jQuery Fileuploadをお勧めします。
とにかく、私はいくつかの洞察を提供できることを願っています。