2012-07-23 21 views
11

ich Probleme beim Hochladen mehrerer Dateien habe Clip mit Papier,Upload mehrerer Dateien mit Büroklammer

meine Modelle sind als solche

slider has_many imgarrays 

imgarrays has_many imageobjects 

imageobjects have_attachment(as for paperclip) 

habe ich keine Probleme ein einzelnes Bild zu empfangen und es mit Büroklammer Speichern auf meinem andere Modelle, aber ich bin mir nicht sicher, wie das Array von imgarrays param während eines mehrfachen Datei-Upload behandelt.

Hier ist meine Schienen Server-Logs:

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 für Schieber

<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

Können Sie eine while-Schleife nicht verwenden, um das zurückgegebene Array zu durchlaufen? – pat34515

+0

oh man, so eine einfache Lösung, danke! Kannst du eine Antwort posten, damit ich sie annehmen kann? – henghonglee

+0

mögliches Duplikat von [Büroklammer, mehrere Anhänge und Validierung] (http://stackoverflow.com/questions/4800985/paperclip-multiple-attachments-and-validation) –

Antwort

11

Hier ist mein Code, der gut mehrere Datei mit Büroklammer hochladen gearbeitet: wir erreichen können, Verwenden geschachtelter Attribute oder Verwendung der normalen einfachen Methode.

Der folgende Code zeigt normale Methode:

User.rb

has_many: Bilder,: abhängig =>:

Image.rb

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

belongs_to: user

Benutzer/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 

Thats it. Bilder wurden hochgeladen, das mag nicht der richtige Weg sein, aber es funktioniert.

Verwandte Themen