2011-10-03 8 views
7

के साथ एकाधिक छवि अपलोड मैं रेल 3 में ड्रैगनफ्लाई के साथ एकाधिक छवि अपलोड करने की कोशिश कर रहा था। मैंने कुछ ट्यूटोरियल की खोज की, लेकिन कोई भी नहीं मिला। मैं Carrierwave साथ एकाधिक छवि अपलोड करने के लिए एक ट्यूटोरियल पाया है, लेकिन ड्रैगनफ्लाई साथ भाग्य .. किसी भी मदद :) कृपया लगता है सकेड्रैगनफ्लाई

उत्तर

10

प्रस्तावना, paperclip के समान

Dragonfly ही सामान्य रूप में अपनी परियोजना के लिए मीडिया प्रबंधन करने के लिए इस्तेमाल किया जा सकता । प्रश्न खुद रेल आवेदन के भीतर एकाधिक फ़ाइल अपलोड पर उबाल जाता है। इस विषय पर कुछ ट्यूटोरियल उपलब्ध हैं, जिन्हें ड्रैगनफ्लाई का उपयोग करके मॉडलों को आसानी से अनुकूलित किया जा सकता है ताकि उन पर विशिष्ट फाइलों को संग्रहित किया जा सके। मैं सुझाव दूंगा कि आप उनको देखें और उन्हें अपनी परियोजना के लिए अनुकूलित करने का प्रयास करें।

हालांकि, मैं वर्तमान में विकास में एक रेल 3.2 ऐप के लिए बनाया गया एक न्यूनतम उदाहरण प्रस्तुत कर सकता हूं, जो सही नहीं है (उदाहरण के लिए सत्यापन प्रबंधन), लेकिन आपको कुछ शुरुआती बिंदु दे सकता है।

उदाहरण

बस संदर्भ के लिए, आवश्यक विचार here से लिया जाता है। यह उदाहरण रेल 3.2.x के साथ किया जाता है।

मान लें कि आपके पास छुट्टी डेटाबेस है, जहां उपयोगकर्ता अपनी छुट्टियों पर यात्रा रिपोर्ट बना सकते हैं। वे एक छोटे से विवरण, साथ ही कुछ तस्वीरें छोड़ सकते हैं।

के दौरे के लिए एक सरल ActiveRecord आधारित मॉडल का निर्माण करके बाहर शुरू

, बस इसे Trip अब के लिए कॉल की सुविधा देता है:

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

आप देख सकते हैं, मॉडल यात्रा छवियों इसे करने के लिए एक has_many संघ के माध्यम से जुड़ा हुआ है।

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

    image_accessor :content 
end 

यात्रा छवि यह स्वयं भंडार फ़ाइल अनुलग्नक: TripImage मॉडल है, जो सामग्री क्षेत्र में संग्रहीत फ़ाइल होने के लिए ड्रैगनफ्लाई का उपयोग करता है पर एक नज़र है करने देता है। आप इस मॉडल के भीतर कोई भी प्रतिबंध लगा सकते हैं, उदा। फ़ाइल आकार या माइम प्रकार।

के एक TripController जो एक 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 %> 
[...] 

इस पल के लिए काम करना चाहिए, हालांकि, देखते हैं इस समय छवियों के लिए कोई सीमा नहीं है।आप एक custom validator के माध्यम से सर्वर साइड पर छवियों की संख्या सीमित कर सकते हैं 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 का सुझाव दूंगा, जैसा कि कई अन्य मेरे सामने हैं।

वैसे भी, मुझे उम्मीद है कि मैं कुछ अंतर्दृष्टि प्रदान कर सकता हूं।

एलजी,

Flo