[Rails] AJAX image manipulation

Max Muermann ruby at muermann.org
Wed Aug 9 23:56:28 GMT 2006


On 8/9/06, Jim Weir <javawaba at hotmail.com> wrote:
> I have this code in a controller that returns images to my browser...with
> ROR.
>
>   def index
>     @products = Product.find_all_ pictures
>   end
>
> ....this is the .rhtml..
>
>
> <% for photo in @pic -%>
>   <div class="entry">
>     <img src="<%= photo.image_url %>"/>
>     <h3><%= h(photo.title) %></h3>
>     <%= photo.description %>
>   </div>
> <% end %>
>
> ....can someonw show me how I can return the results to AJAX?  What I want to
> do is to display  thumbnails along the bottom and when a user clicks on one
> have it a 5x7 area on the screen populated...
>
>   Can AJAX receive resultsets from ROR?
>

Firstly, AJAX is not a thing that is "somewhere in Rails". AJAX is a
name for a bunch of related technologies that can be used to perform
http requests in the background, without reloading the full page. In
Rails, an Ajax call gets mapped to a controller method just like any
other request. You can use the output from the method (normally a
rendered partial) to update a named html element in your view.

To answer your question:

yes, this is entirely possible using Ajax, but if all you need to do
is to change an image, you would probably be better off doing it with
just javascript (Ajax-based solution further down):

Using Javascript:

1. large image:
<img id="big_image" src="<%= product.images[0].url %>">

2. thumbnail bar in your view:

<% for thumbnail in @thumbnails %>
  <img src="<%= thumbnail.url %>" onclick='$('big_image').src='<%=
thumbnail.image_url %>'"
<% end %>

Assuming that the thumbnail class has fields for url (of the
thumbnail) and image_url (of the large image).

BTW, the $('big_image') notation uses the Prototype "$" function,
which is shorthand for document.getElementById. You need to <%=
include_javascript_tag :defaults %> somewhere for this to work.

Using Ajax:

If, for displaying a large image you also want to display other
information (say a description of the image), you can use ajax calls
like so:

1. in your controller:

def large_image
  image_id = params[:id]
  img = Image.find(image_id)
  render :partial=>"image", :locals=>{:image=>image}
end

2. in you partial (called _image.rhtml):

<img src="<% image.url %>" />
<%= image.description %>

3. In your main view:

<div id="big_image">
  <%= render :partial=>'image', :locals=>{:image=>product.images[0]} %>
</div>

<% for thumbnail in @thumbnails %>
  <img src="<%= thumbnail.url %>" onclick='remote_function
:update=>'big_image', :url=>{:action=>large_image,
:id=>thumbnail.image_id}'"
<% end %>

As you can see, for simply showing a different image, the pure
javascript version is much less verbose, which is a good sign that
it's the better solution.

Max


More information about the Rails mailing list