This project is archived and is in readonly mode.

#5682 ✓invalid
Philippe Lang

UJS & partial possible bug

Reported by Philippe Lang | September 22nd, 2010 @ 10:33 AM

Hi,

I'm new to rails, so this might be my fault instead of a bug. But at least it sounds odd. Here are a few files:

list.html.erb

<table>
<% @boxes.each do |box| %>
  <tr>
    <td><%= box.name %></td>
  </tr>
<% end %>
</table>
<div id="add">
  <%=
    render :partial => "list_add"
  %>
</div>

_list_add.html.erb

<%=
  link_to_function("add a new box") do |page|
    page.replace_html "add", :partial => "list_new"
  end
%>

_list_new.html.erb

<%=
  link_to_function("finished adding a new box") do |page|
    page.replace_html "add", ":partial => list_add"
  end
%>

This code crashes the WEBrick server when trying to render list.html.erb:

macbook-pro-de-philippe-lang:attikdb plang$ rails s
=> Booting WEBrick
=> Rails 3.0.0 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2010-09-22 11:09:56] INFO  WEBrick 1.3.1
[2010-09-22 11:09:56] INFO  ruby 1.9.2 (2010-08-18) [x86_64-darwin10.4.0]
[2010-09-22 11:09:56] INFO  WEBrick::HTTPServer#start: pid=2959 port=3000
Illegal instruction
macbook-pro-de-philippe-lang:attikdb plang$

Browser says:

Erreur 324 (net::ERR_EMPTY_RESPONSE) : Erreur inconnue

A small change and the server does not crash anymore:

_list_new.html.erb

<%=
  link_to_function("finished adding a new box") do |page|
    page.replace_html "add", "rendering list_add partial here..."
  end
%>

It looks like rails does not like partials rendering each other through UJS.

What I'm trying to acomplish here is some kind of web 2.0 in-place editing at the bottom of a list. There might be a better way of doing that, sure!

My config: ruby 1.9.2, rails 3.0.0

Comments and changes to this ticket

  • Marjan Krekoten'

    Marjan Krekoten' September 22nd, 2010 @ 09:44 PM

    Well I maybe wrong but your code just enters infinite loop. _list_add.html.erb and _list_new.html.erb render each other until ruby crashes.

  • Philippe Lang

    Philippe Lang September 23rd, 2010 @ 07:04 AM

    • Tag changed from illegal response, partial, ujs to illegal instruction, partial, ujs

    Hi Marjan,

    Each partial renders the other, but only after a click, since "link_to_function" is used. This shouldn't be a problem as far as I understand. But you are right, there must be some kind of infinite loop inside the framework.

  • Marjan Krekoten'

    Marjan Krekoten' September 23rd, 2010 @ 07:11 AM

    It renders partials on server side. JS code on clients side operates with already rendered strings. So while rendering those partials are trying to render each other.

  • Philippe Lang

    Philippe Lang September 23rd, 2010 @ 07:21 AM

    When rendering list.html.erb, I thought that only the _list_add.html.erb partial was rendered, with a link allowing the rendering of the next partial through UJS, and so on. Conceptually, I have to admit I still don't see exactly why this code breaks...

  • Philippe Lang

    Philippe Lang September 23rd, 2010 @ 08:50 AM

    Hum, I think I understand better now. As you say "JS code on clients side operates with already rendered strings". That means rails tries to pre-render both partials rendering each other, UJS or not, resulting in an infinite loop. I could see that with a few puts added at the top of the partials:

    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    ------> rendering add
    ------> rendering new
    Illegal instruction
    

    So I guess this is not a bug at all: rails certainly works like this "by design".

  • David Trasbo

    David Trasbo September 25th, 2010 @ 06:18 PM

    • State changed from “new” to “invalid”
    • Importance changed from “” to “Low”

    See above.

Create your profile

Help contribute to this project by taking a few moments to create your personal profile. Create your profile »

<h2 style="font-size: 14px">Tickets have moved to Github</h2>

The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>

People watching this ticket

Pages