2012-07-23 2 views
11

Ho problemi caricamento di più file utilizzando graffetta,caricamento di più file con graffetta

miei modelli sono in quanto tali

slider has_many imgarrays 

imgarrays has_many imageobjects 

imageobjects have_attachment(as for paperclip) 

non ho problemi di ricezione di una singola immagine e salvandolo con graffetta sulla mia altri modelli, ma non sono sicuro di come gestire l'array restituito dal parametro imgarrays durante un caricamento di più file.

Ecco il mio rotaie log del server:

Started POST "/slider" for 127.0.0.1 at 2012-07-23 10:14:17 +0800 
    Processing by SliderController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"7HcHtSlOsU/bnxb9emhAsSl/GFBraIE6NxwijHl3REM=", "slider"=>{"question"=>"", "answer"=>"", "score"=>"", "industry_name"=>"", 
    "imgarrays"=>[#<ActionDispatch::Http::UploadedFile:0x007fb471e99f30 @original_filename="Icon.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"Icon.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-1lyi4yf>>, #<ActionDispatch::Http::UploadedFile:0x007fb471e99dc8 @original_filename="[email protected]", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"[email protected]\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-10lala2>>, #<ActionDispatch::Http::UploadedFile:0x007fb471e99d50 @original_filename="greenButton.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"slider[imgarrays][]\"; filename=\"greenButton.png\"\r\nContent-Type: image/png\r\n", @tempfile=#<File:/var/folders/2s/n9wb5x4534nfs1cbrlph32v00000gp/T/RackMultipart20120723-53499-or2rdk>>]}, "commit"=>"Create!"} 
Completed 500 Internal Server Error in 18ms 

ActiveRecord::AssociationTypeMismatch (Imgarray(#70206507050500) expected, got ActionDispatch::Http::UploadedFile(#70206487229960)): 
    app/controllers/slider_controller.rb:12:in `new' 
    app/controllers/slider_controller.rb:12:in `create' 

Rendered /Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.4ms) 
Rendered /Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (1.4ms) 
Rendered /Users/Kinnovate/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.1.1/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (6.5ms) 

new.html.erb per scorrimento

<div> 
<%= form_for @slider ,:url=>"/slider" , :html => { :multipart => true } do |f| %> 

     <%= f.label :question , "question"%> 
     <%= f.text_field :question %> </br> 
     <%= f.label :answer , "answer array (comma seperated)"%> 
      <%= f.text_field :answer %> </br> 
     <%= f.label :score , "score"%> 
    <%= f.text_field :score %> </br> 
      <%= f.label :industry_name , "industry"%> 
       <%= f.text_field :industry_name %> </br> 

     <%= f.label :attachedimg , "image"%> 
     <%= f.file_field :imgarrays, :multiple =>:true %> </br> 

     <%= f.submit "Create", class: "btn btn-large btn-primary" %> 
    <% end %> 

</div> 
<%= link_to 'Cancel', slider_index_path %> 
+0

Non è possibile utilizzare un ciclo while per iterare attraverso l'array restituito? – pat34515

+0

oh uomo, una soluzione così facile, grazie! puoi postare una risposta così posso accettare? – henghonglee

+0

possibile duplicato di [Paperclip, più allegati e convalida] (http://stackoverflow.com/questions/4800985/paperclip-multiple-attachments-and-validation) –

risposta

11

Ecco il mio codice che ha funzionato bene per caricare più file utilizzando graffetta: Possiamo raggiungere usando gli attributi annidati o usando il normale metodo facile.

Il codice seguente mostra metodo normale:

User.rb

has_many: immagini: dipendente =>: distruggere

Image.rb

has_attached_file : avatar,: styles => {: medium => "300x300>"}

belongs_to: utente

utenti/views/new.html.erb

<%= form_for @user, :html => { :multipart => true } do |f| %> 

...... 
.... 

<%= file_field_tag :avatar, multiple: true %> 

<% end %> 

Users_controller:

.....

if @user.save 
    # params[:avatar] will be an array. 
    # you can check total number of photos selected using params[:avatar].count 
     params[:avatar].each do |picture|  

     @user.images.create(:avatar=> picture) 
     # Don't forget to mention :avatar(field name) 

     end 
    end 

questo è tutto. le immagini sono state caricate, questo potrebbe non essere il modo migliore ma funziona.