2012-07-23 20 views
11

Estoy teniendo problemas para subir varios archivos usando el clip de papel,cargar varios archivos con un clip

mis modelos son como tal

slider has_many imgarrays 

imgarrays has_many imageobjects 

imageobjects have_attachment(as for paperclip) 

no tengo problemas que recibieron una sola imagen y guardarla usando un clip en mi otros modelos, pero no estoy seguro de cómo manejar la matriz devuelta por el parámetro imgarrays durante la carga de varios archivos.

Aquí está mi carriles registros del servidor:

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 de control deslizante

<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

¿No puedes usar un ciclo while para iterar a través de la matriz devuelta? – pat34515

+0

oh hombre, una solución tan fácil, gracias! ¿Puedes publicar una respuesta para que pueda aceptar? – henghonglee

+0

posible duplicado de [Paperclip, archivos adjuntos múltiples y validación] (http://stackoverflow.com/questions/4800985/paperclip-multiple-attachments-and-validation) –

Respuesta

11

Aquí está mi código que funcionó bien para cargar múltiples archivos usando un clip: Podemos lograr usando atributos anidados o usando el método fácil normal.

El código siguiente muestra el método normal:

User.rb

has_many: imágenes,: dependiente =>: destruir

Image.rb

has_attached_file : avatar,: estilos => {: medio => "300x300>"}

belongs_to: usuario

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

Eso es todo. las imágenes se cargan, esta puede no ser la mejor manera, pero funciona.

Cuestiones relacionadas