Hi guys and gals. I don't know how to explain this too well, so I'll try my best and post some obviously dysfunctional code (just so you can get the idea of what I'm after if my explanation doesn't do it.) What I want to do is create an upload form that users can upload more than one item with. The catch is I want to use ajax to pull off an insert_html and update the page showing thumbnail to each file as it's added, while the other files are being uploaded. So, let's say I upload 3 files, when the first one finishes it's inserted to an unordered list (via ajax, without reloading the page while the other two files are still uploading), then the next file, then the last file and it ends. I've been doing it fine with a single file, but now that I've added multiple file uploads that controller style won't work. Doing something like this, which I figured was a 1,000,000:1 shot at it working (of course, it didn't) gives a DoubleRender error which I expected: def create @project = Project.find(params[:id]) params[:attachment].each do |key, value| if value and value != '' @file = Image.new(Hash['uploaded_data' => value]) @file.user_id = logged_in_user.id @file.project_id = @project.id respond_to do |format| if @file.save format.js do responds_to_parent do render :update do |page| page.insert_html :top, "images", :partial => 'image', :object => @file end end end else # etc... end end end else # etc. end Can this sort of thing even be pulled off?
on 2009-04-07 05:45
on 2009-04-07 06:36
You want to execute multiple inserts in a single response, not multiple responses. This might work, assuming that the rest of your code works and that you are using attachments as the relationship name. def create @project = Project.find(params[:id]) params[:attachment].each do |key, value| if value and !value.blank? new_file = Image.new(Hash['uploaded_data' => value]) new_file.user_id = logged_in_user.id @project.attachments << new_file end end respond_to do |format| if @project.save format.js do render :update do |page| @project.attachments.each do |file| page.insert_html :top, "images", :partial => 'image', :object => file end end end end end end On Apr 7, 9:45 am, Jack B. <email@example.com>
on 2009-04-07 18:04
Hi Jaryl, thanks. That would work, but it has a slightly different behavior than what I'm looking for. I want it to begin the upload of the multiple images, let's say 3, and when one finishes being processed (resized, etc.) it's inserted into the page and then the second image starts being processed and inserted, then the third. Your solution would process all three and after it finishes processing it'll dump all 3 of them out at essentially the same time. It's a relatively unimportant difference, but I was wondering if there's a way to pull that off.
on 2009-04-08 02:19
Google for a Rails version of swfupload... in the Rails code it updates the thumbnails as it processes the files.
on 2009-04-08 09:49
If that's the case, then you should split it up into multiple requests. I believe that you can only send back one response per request, so that is an inherent problem. Perhaps you may try sending a request once the a valid file is selected in the file upload field. On Apr 7, 10:04 pm, Jack B. <firstname.lastname@example.org>
on 2009-04-08 17:27
on 2009-04-08 17:59
Thanks everyone for the replies. For now I'm just going with good 'ol standard HTML response until I figure out what I'm going to do.