Ruby on Rails
Monday, May 3, 2010
On May 3, 2010, at 3:20 PM, Anand Ramanathan wrote:
Thanks, Rob
I tried a variant of your suggestion, where I redirect instead of send_data (since in my case, the images are coming from elsewhere) - I still have the same issue (that the images are all rendered once in the end,not one by one as they are retrieved). Here is the current code:
main controller:
def show_images
render :update do |page|
page.replace_html 'images-div', ''
@query.load_images! do |image|
@image = image
page.insert_html :bottom, 'images-div', :partial => 'image' unless @image.id.nil?
end
end
end
query model:
def load_images!
...
for(some_loop_that_gets_one_image_at_a_time)
block.call(image)
end
...
end
_image.html.erb
<%=image_tag('/images/%s/show' % @image.id)%>
Right here, just let the browser leverage HTTP to get the parallelized behavior you seek:
<%= image_tag @image.url %>
or even:
<img src="<%= @image.url %>" />
If you're doing a redirect, the url isn't going to be "hidden" anyway.
You're never going to get the images to show up "one at a time" unless you stop doing all the work in one request.
-Rob
images_controller:
def show
@image = Image.find(params[:id])
redirect_to @image.url
end
Thanks
AnandOn Mon, May 3, 2010 at 11:01 AM, Rob Biedenharn <Rob@agileconsultingllc.com> wrote:
On May 3, 2010, at 1:49 PM, candor wrote:<img src="/controller/show_image?image_id=1" />
I tried a couple other approaches, but no success yet:
1. I reversed the blocks below - calling the load_images from within
render :update - that did give me the results, but all at once in the
end, not as the images show up.
2. I called redirect_to <controller/show_image?image_id=1 within the
inner loop in 1, and created a show_image.js.rjs file which calls
page.insert_html :bottom, 'images-div', :partial => 'image', but I get
an error 'ActionView::MissingTemplate (Missing template <mycontroller>/
show_image.erb in view path app/views) I dont really understand why
this is happening - shouldnt it pick the rjs template if present
instead of the erb?
What I really want is to leverage http to parallelize the retrieval
and rendering of images. How do I do that?
Thanks
Anand
Then the browser will ask for that URL and you can respond with a send_file or send_data (rather than a render or redirect).
-RobRob Biedenharn http://agileconsultingllc.com
On May 3, 9:11 am, candor <rcan...@gmail.com> wrote:
Hi,
I have a rails application where I respond to a request by fetching
image urls from various web api calls and need to display them as they
come available. I am able to display all the images once I get them
all, but that causes an unacceptable delay for my user.
One approach I am trying is, from my controller, set an @image
variable, and then pass in a block to the model that retrieves the
image urls. In the block, I call
In the controller, I have:
@query.load_images! do |image|
@image = image
render :update do |page|
page.insert_html :bottom, 'images-div', :partial => 'images'
end
end
In my query model, I have:
def load_images! &block
for(some_loop_that_gets_one_image_at_a_time) do
image = get_next_image
block.call(image)
end
end
In the _images.html.erb, I have:
<%=image_tag @image.url %>
The problem is that with this approach, I get a DoubleRenderError, and
I think this is because render is being called multiple times in the
block call within the loop.
What is the best way to get the effect I need (to load images one at a
time as they become available)?
Thanks
Anand
Rob@AgileConsultingLLC.com
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment