2011-10-03 23 views
7

Próbowałem przesłać wiele obrazów za pomocą ważki w szynach3. Szukałem kilku tutoriali, ale nie mogłem znaleźć żadnych. znalazłem poradnik dla wielokrotnego przesyłania obrazu z Carrierwave, ale nie mogliśmy znaleźć szczęście z ważki .. Każda pomoc proszę :)Przesyłanie wielu obrazów za pomocą ważki

Odpowiedz

10

Przedmowa

Dragonfly sama może być używany do zarządzania nośnikami dla swojego projektu w ogóle, podobnie jak paperclip . Samo pytanie sprowadza się do wielokrotnego przesyłania plików w aplikacji szyny. Dostępne są niektóre samouczki na ten temat, które można łatwo dostosować do modeli używających Dragonfly do przechowywania określonych plików na nich. Sugerowałbym, żebyś spojrzał na te i spróbował dostosować je do swojego projektu.

Mogę jednak przedstawić minimalny przykład, który stworzyłem dla obecnie opracowywanej aplikacji szynowej 3.2, która nie jest idealna (na przykład obsługa sprawdzania poprawności), ale może dać ci kilka punktów początkowych.

Przykład

Tylko dla odniesienia, niezbędne pomysł pochodzi od here. Ten przykład jest wykonywany z Railsami 3.2.x.

Załóżmy, że masz bazę danych na wakacje, w której użytkownicy mogą tworzyć raporty podróży z wakacji, które zrobili. Mogą zostawić mały opis, a także kilka zdjęć.

Zacznij od budowy prostego modelu do ActiveRecord opartą na wycieczki, pozwala właśnie nazwać Trip teraz:

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

Jak widać, model ten zdjęć trip przymocowany do niego za pośrednictwem stowarzyszenia has_many. Pozwala rzucić okiem na model, który wykorzystuje TripImage ważki za posiadanie plik zapisany w polu Treść:

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

    image_accessor :content 
end 

Podróż obraz przechowuje własny pliku załącznika. Możesz umieścić ograniczenia w tym modelu, np. rozmiar pliku lub typ MIME.

Stwórzmy TripController który ma działanie new i create (można wygenerować to przez rusztowania, jeśli chcesz, to jest zdecydowanie nic szczególnego):

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 

nic specjalnego tutaj, z wyjątkiem tworzenia obrazy z innego wpisu niż skrót hasłowy params. Ma to sens, gdy patrząc na polu przesyłania plików w szablonie pliku new.html.erb (lub częściowego korzystania z pól na modelu Trip):

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

To powinno działać w tej chwili, jednak istnieją żadnych ograniczeń dotyczących obrazów w tej chwili.Można ograniczyć liczbę obrazów na stronie serwera za pośrednictwem custom validator modelu 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 

zostawiam to do ciebie, ale można też użyć po stronie klienta walidacji na polu Plik, ogólna idea będzie być sprawdzenie plików na zmianę pola pliku (w coffeescript):

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

Podsumowanie

można zbudować wiele z istniejących tutoriali, jak ważka, że ​​nie zachowuje się inaczej niż inne rozwiązania, gdy przychodzi do tylko do przesyłania plików. Jednakże, jeśli chcesz coś bardziej wyszukanego, sugerowałbym jQuery Fileupload, jak wielu innych ma przede mną.

W każdym razie, mam nadzieję, że mogę zapewnić pewien wgląd.

lg,

flo

Powiązane problemy