2011-10-03 38 views
7

tôi đã cố gắng tải lên nhiều hình ảnh với chuồn chuồn trong đường ray3. tôi đã tìm kiếm một số hướng dẫn, nhưng không thể tìm thấy bất kỳ hướng dẫn nào. tôi tìm thấy một hướng dẫn cho nhiều tải lên hình ảnh với Carrierwave, nhưng couldnt tìm may mắn với con chuồn chuồn .. bất kỳ sự giúp đỡ xin vui lòng :)tải lên nhiều hình ảnh với chuồn chuồn

Trả lời

10

Lời nói đầu

Dragonfly chính nó có thể được sử dụng để quản lý các phương tiện truyền thông cho dự án của bạn nói chung, tương tự như paperclip . Bản thân câu hỏi sẽ tự động tải xuống nhiều tệp trong một ứng dụng đường ray. Một số hướng dẫn về chủ đề này có sẵn, có thể dễ dàng thích nghi với các mô hình sử dụng Dragonfly để lưu trữ các tệp cụ thể trên chúng. Tôi sẽ đề nghị bạn xem xét chúng và cố gắng thích ứng với chúng cho dự án của bạn.

Tuy nhiên, tôi có thể trình bày một ví dụ tối thiểu mà tôi đã xây dựng cho ứng dụng đường ray 3.2 hiện đang phát triển, không hoàn hảo (ví dụ như xử lý xác thực), nhưng có thể cung cấp cho bạn một số điểm bắt đầu.

Ví dụ

Chỉ để tham khảo, ý tưởng thiết yếu được lấy từ here. Ví dụ này được thực hiện với Rails 3.2.x.

Giả sử bạn có cơ sở dữ liệu kỳ nghỉ, nơi người dùng có thể tạo báo cáo chuyến đi về các kỳ nghỉ họ đã đi. Họ có thể để lại một mô tả nhỏ, cũng như một số hình ảnh.

Bắt đầu ra bằng cách xây dựng một đơn giản mô hình ActiveRecord dựa cho các chuyến đi, cho phép chỉ cần gọi nó Trip cho bây giờ:

class Trip < ActiveRecord::Base 
    has_many :trip_images 
    attr_accessible :description, :trip_images 
end 

Như bạn có thể thấy, mô hình đã hình ảnh chuyến đi gắn liền với nó thông qua một hiệp hội has_many. Cho phép có một cái nhìn nhanh vào mô hình TripImage, trong đó sử dụng con chuồn chuồn vì có các tập tin được lưu trữ trong lĩnh vực nội dung:

class TripImage < ActiveRecord::Base 
    attr_accessible :content, :trip_id 
    belongs_to :trip_id 

    image_accessor :content 
end 

Hình ảnh chuyến đi nó tự lưu trữ các tập tin đính kèm tập tin. Bạn có thể đặt bất kỳ phần nào trong mô hình này, ví dụ: kích thước tệp hoặc loại mime.

Hãy tạo một TripController trong đó có một hành động newcreate (bạn có thể tạo ra điều này qua giàn giáo nếu bạn thích, nó là của xa không có gì lạ mắt):

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 

Không có gì đặc biệt ở đây, với ngoại lệ của tạo hình ảnh từ một mục nhập khác với mã băm params. điều này làm cho cảm giác khi nhìn vào lĩnh vực tập tin tải lên trong new.html.erb tập tin mẫu (hoặc trong một phần bạn sử dụng cho các lĩnh vực trên mô hình Trip):

[...] 
<%= f.file_field :trip_images, :name => 'images[]', :multiple => true %> 
[...] 

này nên làm việc cho thời điểm này, tuy nhiên, có không có giới hạn cho các hình ảnh về điều này ngay bây giờ.Bạn có thể giới hạn số lượng hình ảnh ở phía máy chủ thông qua một custom validator trên mô hình 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 

Tôi để điều này tùy thuộc vào bạn, nhưng bạn cũng có thể sử dụng kiểm chứng thực phía khách hàng trên các lĩnh vực tập tin, ý tưởng chung sẽ được để kiểm tra các tập tin khi thay đổi lĩnh vực tập tin (trong CoffeeScript):

jQuery -> 
    $('#file_field_id').change() -> 
     #disable the form 
     for file in this.files 
      #check each file 
     #enable the form 

Tóm tắt

Bạn có thể xây dựng rất nhiều ra các hướng dẫn hiện hành, như con chuồn chuồn không cư xử mà khác với các giải pháp khác khi chỉ cần chỉ cần để tải tệp lên. Tuy nhiên, nếu bạn muốn một cái gì đó fancier, tôi đề nghị jQuery Fileupload, như nhiều người khác có trước tôi.

Dù sao, tôi hy vọng tôi có thể cung cấp một số thông tin chi tiết.

lg,

flo

Các vấn đề liên quan