RJS template dont-know-how

Hello!

Get a problem out here. I need to update flash notice with every one
remote request. Flash.now[:notice] does that trick but not for
remoting methods. So I’ve applied some after_filter (say
clear_notice_on_xhr) but its render method not evaluating or i can’t
see the result:
def clear_notice_on_xhr
return unless request.xhr?
render :update do |page|
page.replace_html(“notice” , :partial => “layouts/notice”)
end
rescue
nil
end

Help!

On 13 Mar 2008, at 09:26, sinm wrote:

render :update do |page|
page.replace_html(“notice” , :partial => “layouts/notice”)
end
rescue
nil
end

If I were you I’d remove that rescue nil statement as that will
swallow any errors that might be telling you what is wrong.

Fred

ActionController::DoubleRenderError (Can only render or redirect once
per action) raises. So, thats the problem - I cant “inject” RJS into
template.

Anyone?

On 13 Mar 2008, at 12:23, sinm wrote:

Anyone?

You;ve already found the problem: you’ve already rendered, so you
can’t render again. If people could see the whole story rather than
just one bit, someone might be able to suggest an alternative.

Fred.

I think it does not work to implement it as ‘after_filter’ as long the
action executed before that filter calls ‘render’, too.

so for example:

def index

calls (implecitely) render index.erb.html # or in your case

another rjs
end

def clear_notice_on_xhr
return unless request.xhr?
# CALLS RENDER AGAIN ON THE SAME HTTP REQUEST
# that doesnt work 'cause IMHO rails does not know how to merge
these 2 render outputs
render :update do |page|
page.replace_html(“notice” , :partial => “layouts/notice”)
end
rescue
nil
end

mercy
blog.odeley.com

I found the problem but i dont know how to solve it.
Story:
I want to evaluate the same page.replace_html method in every rjs
template.
Question:
How to do that?

On Mar 13, 3:37 pm, Frederick C. [email protected]

sinm wrote:

Ok. I know from the beginning that DoubleRenderError, but how to
include that same page.replace_html method in every rjs
template? Rails seemed to be dynamic and powerful but in fact i cant
implement that very simple scenario… silly.

Rather than use a partial, create the text in your after_filter method
and add a call to the end of the response body to action it as
javascript. This is a little messy, but you could hide it away. There
may well be an easier way, but this seems to work for me:

after_filter :clear_notice_on_xhr

def clear_notice_on_xhr
new_text = “New flash notice created here”
script = <<EOS

EOS
response.body << script
end

This assumes you are including the Prototype javascript library in your
pages (will need re-writing otherwise) and the tag where you display
your flash has an id of “notice”.

Ok. I know from the beginning that DoubleRenderError, but how to
include that same page.replace_html method in every rjs
template? Rails seemed to be dynamic and powerful but in fact i cant
implement that very simple scenario… silly.

Thanx Mark for your try!
Really messy but it really works.
Finally i ended up with slightly different version.

after_filter :clear_notice_on_xhr

#TODO: bad smell
def clear_notice_on_xhr
return unless request.xhr?
response.body = “$(‘notice’).update(‘’);” + response.body
rescue
nil #optional
end

On Mar 13, 7:06 pm, Mark B. [email protected]