JHuizingh wrote:
> I'm having an issue with the design of my views that I can't seem to
> wrap my head around.  I have a page where I am showing a collection of
> objects in a list.  The way that I designed it, it looked something
> like this:
> 
> main view:
> 
> <h2>here is the list</h2>
> <ul>
>     <%= render(:partial => "items/item", :collection => @items %>
> </ul>
> 
> 
> collection item's view:
> 
>  <li id="<%= dom_id(item)  %>">
>      ...  INFO ABOUT item....
> </li>
> 
> 
> This works great, creating a <ul> that is full of <li>'s.  I hit a
> snag when I start trying to update individual <li> items with ajax
> calls.  The :update option for  link_to_remote() and related functions
> doesn't give me an option to replace the dom element that it refers to
> as far as I can tell.  It lets me specify a dom id that I can change
> the innerHTML of, insert the returned html with in it at the beginning
> or the end, before or after the element, but it doesn't seem to allow
> me to REPLACE the element.
> 
> So a call like this:
> 
> remote_function(:url => credential_search_instance_path
> (credential_search_instance),
>                              :method => :put,
>                              :update => dom_id(item)
>                            )
> 
> Will replace the html inside of the <li> element, so it would update
> the page to look like this:
> 
>  <li id="item_1">
>  <li id="item_1">
>      ...  INFO ABOUT item....
> </li>
> </li>
> 
> 
> I ended up getting around the issue by checking if it is an xhr
> request in my item view like this;
> <% if ! request.xhr? then %>
>  <li id="<%= dom_id(item)  %>">
> <% end %>
>      ...  INFO ABOUT item....
> <% if ! request.xhr? then %>
> </li>
> <% end %>
> 
> That solution works, but it seems very inelegant and adds a lot of
> noise to the view.  Is it really true that I can't replace the dom
> element?  Am I missing something?  Is there a better way to design my

The best solution would be to move the li tags to a layout:

render :partial => "items/item", :collection => @items, :layout => 'li'

Where _li.html.erb contains

<li><%= yield %></li>

However this is broken in 2.2.2 (it instead renders a collection
of the collection). I've created a ticket:
http://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/1688

So until this works, the other options are:

1. Replace the collection with a loop, either using the
    layout option, or putting the li tags in the main view,

2. Create a second level of partial, or

3. Remove the :update option and use outer-HTML replace RJS calls.

-- 
Rails Wheels - Find Plugins, List & Sell Plugins - http://railswheels.com

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to