Forum: Ruby on Rails render :update problem

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-24 19:22
(Received via mailing list)
I have this div in my application.rhtml file:

<div id="shelfcards"> <%= render :partial => 'ericssoncards' %></div>

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("<fieldset style='width: 400px;'>
\n<legend>Select your card type</legend>\n\n\t<div id='oc192'
class='card' >OC-192</div>\n\t<div id='oc48' \t\tclass='card' >OC-48</
div>\n\t<div id='oc12' \t\tclass='card' >OC-12</div>\n\t<div id='oc3'
\t\tclass='card' >OC-3</div><br /><br />\n\t<div id='28pds1'
\tclass='card' >28P DS-1</div><br /><br />\n\t<div id='egcm' \t
\tclass='card' >EGCM</div><br /><br />\n\t<div id='gbeth'
\tclass='card' >GB ETH</div><br /><br />\n\t<div id='vt5g' \t
\tclass='card' >VT 5G</div><br /><br />\n</fieldset> \t\t");
} catch (e) { alert('RJS error:\n\n' + e.toString()); alert('$
(\"shelfcards\").update(\"<fieldset style=\'width: 400px;\'>\
\n<legend>Select your card type</legend>\\n\\n\\t<div id=\'oc192\'
class=\'card\' >OC-192</div>\\n\\t<div id=\'oc48\' \\t\\tclass=\'card
\' >OC-48</div>\\n\\t<div id=\'oc12\' \\t\\tclass=\'card\' >OC-12</div>
\\n\\t<div id=\'oc3\' \\t\\tclass=\'card\' >OC-3</div><br /><br />\\n\
\t<div id=\'28pds1\' \\tclass=\'card\' >28P DS-1</div><br /><br />\\n\
\t<div id=\'egcm\' \\t\\tclass=\'card\' >EGCM</div><br /><br />\\n\
\t<div id=\'gbeth\' \\tclass=\'card\' >GB ETH</div><br /><br />\\n\
\t<div id=\'vt5g\' \\t\\tclass=\'card\' >VT 5G</div><br /><br />\\n</
fieldset> \\t\\t\");'); throw e }

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

What causes this?
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-02-24 19:32
(Received via mailing list)
On 24 Feb 2009, at 18:14, Me wrote:

>     end
>  end
>

What does the think making the ajax request look like ?

Fred
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-24 19:33
(Received via mailing list)
Not an ajax call.  Does it only work for an ajax call?

On Tue, Feb 24, 2009 at 12:31 PM, Frederick Cheung <
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-24 21:03
(Received via mailing list)
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.
D93ae163042e0a937941e0ba4d8ed5d7?d=identicon&s=25 Eric (Guest)
on 2009-02-24 21:55
(Received via mailing list)
Is there an error in the log at all for your current implementation?
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-24 22:01
(Received via mailing list)
Well the previous TRY error filled the screen.
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-02-24 23:32
(Received via mailing list)
On 24 Feb 2009, at 18:32, Chris Habgood 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
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-24 23:41
(Received via mailing list)
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:
<div id="shelfcards"> </div>

has the partial for the cards in the shelf.

On Tue, Feb 24, 2009 at 4:32 PM, Frederick Cheung <
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-24 23:50
(Received via mailing list)
I am baffled because in the view I do this:

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

Gives me nothing in the div.
81b61875e41eaa58887543635d556fca?d=identicon&s=25 Frederick Cheung (Guest)
on 2009-02-25 09:10
(Received via mailing list)
On Feb 24, 10:49 pm, Me <chabg...@gmail.com> 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(<fieldset>....</fieldset>)
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
A10ba5e890803847d0ee59e178dfd8a3?d=identicon&s=25 Jeremy Olliver (Guest)
on 2009-02-25 13:22
(Received via mailing list)
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
8133ee52ca72188132b5c7d97dfb967f?d=identicon&s=25 Chris Habgood (chabgood)
on 2009-02-25 16:07
(Received via mailing list)
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' %>);
This topic is locked and can not be replied to.