Uploading multiple files with paperclip

本秂侑毒 提交于 2019-11-26 11:14:52

问题


I am having problems uploading multiple files using paper clip,

my models are as such

slider has_many imgarrays

imgarrays has_many imageobjects

imageobjects have_attachment(as for paperclip)

I have no problems receiving a single image and saving it using paperclip on my other models, but i am not sure of how to handle the array returned by imgarrays param during a multiple file upload.

Here is my rails 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=\"Icon@2x.png\", @content_type=\"image/png\", @headers=\"Content-Disposition: form-data; name=\\\"slider[imgarrays][]\\\"; filename=\\\"Icon@2x.png\\\"\\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 for slider

<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 %>

回答1:


Here is my code that worked well to upload multiple file using paperclip: We can achieve using nested attributes or using normal easy method.

The following code shows normal method:

User.rb

has_many :images, :dependent => :destroy

Image.rb

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

belongs_to :user

users/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. images got uploaded, this may not be the good way but it works.



来源:https://stackoverflow.com/questions/11605787/uploading-multiple-files-with-paperclip

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!