Rails 3的每种方法和Ajax

I'm trying to implement some Ajax in my app. A strange behaviour occurs! It's a daycare application. When you show a specific daycare of a specific date you can add some children. Originally a list of the children of the database is generated and when you click on one of them the page reload and a new child appears in the attendance list of the daycare. It's working fine, i just wanna add some ajax to be more userfriendly !

When you click on child to add him to the daycare, a daycare_item is created ( join table, an id of the child and the id of the daycare ).

I make the changes to make it ajax ready:

  • partial for the list
  • format.js in the daycare_item controller
  • remote true on the link.

It works, no more reload! But the list is updated only when you click a second time on the children list ( the last child added doesn't appears yet ). The js transaction works and if you refresh manually the page, the missing child appears.

I tried few things and here are my results:

In my partial there are

<% @daycare.daycare_items.each do |c| %>
  <li><%= c.child.firstname ></li>
<% end %>

This produce the "lag" effect with one children who is not showing ( until a full refresh )

But if i put a

<%= @daycare.daycare_items.count %>

the code is update in time ! I see nothing strange in the logs. I'm asking why the .each method make a difference?

A var was stoping a part of the code to be executed, the var wasn't wrong and doesn't generate an error.

The elements involved: daycare_items controller

def create
  @daycare = Daycare.find(params[:daycare_id]) # for Ajax
  @daycare_item = DaycareItem.new(params[:daycare_item])
....
end

the create.js.erb

$('#children-list').html(" <%=j render partial: 'daycares/daycare', locals: { daycare: @daycare } %> ");

the view daycares#show

<div id="children-list">
  <%= render @daycare %>
</div>

the partial ( a part of ) _daycare.html.erb

<p>counting test:<%= daycare.daycare_items.count %></p>

# here was something like this <%= @waiting.count %> @waiting is define in the daycare controller but not in the daycare_items controller
<p>
  <% daycare.daycare_items.each do |dci| %>
    <%= dci.enfant.prenom %>
  <% end %>
</p>