7

Rails3でトンボを使用して複数の画像をアップロードしようとしていました。いくつかのチュートリアルを検索しましたが、見つかりませんでした。Carrierwave で複数の画像をアップロードするためのチュートリアルを見つけましたが、トンボで運を見つけることができませんでした..何か助けてください :)

4

1 に答える 1

10

序文

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 を介してこれを生成できます。これは決して特別なことではありません)。newcreate

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をお勧めします。

とにかく、私はいくつかの洞察を提供できることを願っています。

于 2012-06-25T12:13:30.473 に答える