Render :update problem


I have this div in my application.rhtml file:

<%= render :partial => 'ericssoncards' %>

When I go to another view I am doing this:

def turin2000
render :update do |page|
page[:shelfcards].replace_html :partial => ‘turin2000’

I get this for an output:

try {
\nSelect your card type\n\n\t

\n\t<div id=‘oc48’ \t\tclass=‘card’ >OC-48</
div>\n\t<div id=‘oc12’ \t\tclass=‘card’ >OC-12\n\t<div id=‘oc3’
\t\tclass=‘card’ >OC-3

\n\t<div id=‘28pds1’
\tclass=‘card’ >28P DS-1

\n\t<div id=‘egcm’ \t
\tclass=‘card’ >EGCM

\n\t<div id=‘gbeth’
\tclass=‘card’ >GB ETH

\n\t<div id=‘vt5g’ \t
\tclass=‘card’ >VT 5G

\n \t\t");
} catch (e) { alert(‘RJS error:\n\n’ + e.toString()); alert(’$
(“shelfcards”).update("<fieldset style=‘width: 400px;’>
\nSelect your card type\n\n\t<div id=‘oc192’
class=‘card’ >OC-192\n\t<div id=‘oc48’ \t\tclass=‘card
’ >OC-48\n\t<div id=‘oc12’ \t\tclass=‘card’ >OC-12
\n\t<div id=‘oc3’ \t\tclass=‘card’ >OC-3

\t<div id=‘28pds1’ \tclass=‘card’ >28P DS-1

\t<div id=‘egcm’ \t\tclass=‘card’ >EGCM

\t<div id=‘gbeth’ \tclass=‘card’ >GB ETH

\t<div id=‘vt5g’ \t\tclass=‘card’ >VT 5G

fieldset> \t\t");’); throw e }

If I put this partial inside the div manually it works fine.

What causes this?


On 24 Feb 2009, at 18:14, Me wrote:



What does the think making the ajax request look like ?



Not an ajax call. Does it only work for an ajax call?

On Tue, Feb 24, 2009 at 12:31 PM, Frederick C. <


All I am trying to do is to put a different partial in place of the
the once that is already there. Not an ajax call to the function.


Is there an error in the log at all for your current implementation?


On 24 Feb 2009, at 18:32, Chris H. wrote:

Not an ajax call. Does it only work for an ajax call?

Yes. if you use render :update it returns some javascript. The
prototype (and jquery etc.) libraries know to execute that javascript,
but just a generic browser page load doesn’t

If you want to replace a page fragment you have to use an ajax request
(although you don’t have to use render :update):

if you have link_to_remote ‘Click me’, :update => ‘some_id’, :url =>
{:action => ‘foo’}

and then

def foo
render …

Then the results of that render will get stuck in the page element
with id some_id. You only need the render :update / rjs mechanism to
update multiple things on the page.



Well the “page fragment” is a div with a partial in it. I need to be
to make a regular call and update the div with the partial. I have a
box used to go to a page. I need to be able to change out what is in

<%= select(:node, :id, $shelves,{:prompt =>‘Select Equipment’},{
=> "document.location.href = ‘/buildshelf/’ + this.value "} ) %>

This div:

has the partial for the cards in the shelf.

On Tue, Feb 24, 2009 at 4:32 PM, Frederick C. <


I am baffled because in the view I do this:

$(‘shelfcards’).update(<%= render :partial => ‘turin2000’ %>);

Gives me nothing in the div.


Well the previous TRY error filled the screen.


On Feb 24, 10:49 pm, Me removed_email_address@domain.invalid wrote:

I am baffled because in the view I do this:

$(‘shelfcards’).update(<%= render :partial => ‘turin2000’ %>);

Gives me nothing in the div.

Think about what actually ends up in the page:

Clearly that isn’t legal javascript because you’ve just dumped in a
chunk of html, whereas you need a string containing html

$(‘shelfcards’).update(’<%= render :partial => ‘turin2000’ %>’);

would be a start, but would also be invalid if what you rendered
contained a ’



Ya, I am not doing an ajax call because it is not really needed. I can
possibly have new equipment and that would require more maintenance to
the ajax call where to go for that piece of eqpt. The way I am doing
just require an array entry and a controller action. Anyway, I got it
work by doing this in the view:

$(‘shelfcards’).innerHTML = (<%= render :partial => ‘turin2000’ %>);


Do note, that this is not really ajax. The point of ajax, and more
importantly the use of rendering a partial is that when you make the
request you are not reloading the entire page, but rather using
javascript to send a request to the server in the background while the
existing page doesn’t reload. Using the javascript
document.location.href call makes a full page load (regular html page
request). To implement this instead with ajax you might instead have
the select element inside a form, which you would post to a controller
action (you can send the form using the onchange option for the select

The reason for this is because the partial contains only part of a
valid html page as Fred mentioned, using this method the controller
action responding to the call, can then respond with something like
page.replace_html :partial => “my_partial”, which is some javascript
telling the page that send the request to replace part of it’s old
html with the new version (sent as a string inside the javascript).
Doing it this way will get teh ajax request working correctly (a true
ajax call, with an rjs or render(:update) controller response). It’s
either that or return an entire html page with fresh contents on the
page called by ‘/buildshelf/’ + this.value "