Render :update problem


#1

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’
end
end

I get this for an output:

try {
$(“shelfcards”).update("
\nSelect your card type\n\n\t

OC-192
\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

\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</
fieldset> \t\t");’); throw e }

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

What causes this?


#2

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

end

end

What does the think making the ajax request look like ?

Fred


#3

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

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


#4

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.


#5

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


#6

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 …
end

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.

Fred


#7

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

<%= select(:node, :id, $shelves,{:prompt =>‘Select Equipment’},{
:onchange
=> "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. <


#8

I am baffled because in the view I do this:

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

Gives me nothing in the div.


#9

Well the previous TRY error filled the screen.


#10

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:

$(‘shelfcards’).update(…)
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 ’

Fred


#11

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
tell
the ajax call where to go for that piece of eqpt. The way I am doing
would
just require an array entry and a controller action. Anyway, I got it
to
work by doing this in the view:

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


#12

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
tag).

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 "

Cheers,
Jeremy