Ajax with layout templates

Hello,
Here is the situation:

I have a List action that lists items for me (scaffold generated), now
I need to the destroy method to be ajaxed, I wrote the following:

################################
<%=link_to_remote (‘Destroy’,
:update => “main”,
:url => {:action => ‘destroy’, :id =>
@category},
:confirm => ‘Are you sure?’,
:post => true,
:loading =>
“document.getElementById(‘loading’).style.display=‘inline’”,
:loaded =>
“document.getElementById(‘loading’).style.display=‘none’”)%>
#################################

OK, everything’s going fine except that destroy method must -of course-
redirect the page to the list action:

##################################
def destroy
Category.find(params[:id]).destroy
redirect_to :action => ‘list’
###################################

Now the problem is that layout is regenerated for the list action after
the redirect so I get a doubled layout with the page. I may not except
the list method from the layout because it will not show the page
layout when listing items.

I have searched the rails documentation and found this:
render :action => “list”, :layout => false

But this didn’t work, it caused an error.

Do you suggest some other solution?

(Yes, I really am THIS far behind in list reading. sigh)

AN@S wrote:

@category},
:confirm => ‘Are you sure?’,
:post => true,
:loading =>
“document.getElementById(‘loading’).style.display=‘inline’”,
:loaded =>
“document.getElementById(‘loading’).style.display=‘none’”)%>
#################################

An easier way to show your “loading” image is to use some of the
Prototype helpers:

:loading => “Element.show(‘loading’)”,

Now the problem is that layout is regenerated for the list action after

It looks like you’re kind of mixing AJAX and non-AJAX techniques here.

Your link_to_remote is expecting HTML which will replace your “main”
element. Rather than re-direct to your list method you can instead use
render to generate the HTML for “main”. If your “list” method is simple
you can just duplicate the “list” method ending with “render :action =>
‘list’, :layout => false”. (The “:layout => false” will prevent the
layout from being duplicated inside your “main” section.)

If the “list” method is longer you can extract the common code into a
method that both destroy and list call before each method does it’s
render action.

Hope that helps,

David