render partial issue

Hope you have any solution for this

I have a view with two partials:

<!-- LIST --> <div>        <p id="ppaypend">                <%= render :partial => 'list' %>        </p> </div> <!-- FORM --> <div id="form" style="display: none; ">        <%= render :partial => 'form' %> </div>

_list.html.erb partial code is here:

<table>        <thead>                <tr>                        <th>Service</th>                        <th>percentaje</th>                        <th>Amount</th>                        <th>date</th>                        <th>Select</th>                </tr>        </thead>        <tbody>        <% for payment in @payments do %>                <tr>                        <td><%= payment.service.description %></td>                        <td><%= payment.service.percentage %></td>                        <td><%= payment.amount %></td>                        <td><%= payment.created_at.to_s(:db) %></td>                        <td><%= link_to 'Select', edit_payment_path(payment), :remote => true %></td>                </tr>        <% end %>        </tbody> </table>

the idea of the code is when someone select any item in the table the form appears to show some information and then the user can update and submit their changes. After the submit the list need to be updated and I'm doing it with the following code in the update.js.erb file

$("#ppaypend").html("<%= escape_javascript( render :partial =>"list" ) %>");

(when i comment this line everything works but obviously the list does not show the changes)

in my controller i have this to assure the @payments is created every request:

class PaymentsController < ApplicationController before_filter :load

def load    @payments = Payment.joins(:application_form).where('application_forms.status' =>'pending')    @payment = end ..... end

the error i have is:

ActionView::Template::Error (undefined method `each' for #<Payment: 0x10a3039e0>):    9: </tr>    10: </thead>    11: <tbody>    12: <% for payment in @payments do %>    13: <tr>    14: <td><%= payment.service.description %></td>    15: <td><%= payment.service.percentage %></td> app/views/payments/_list.html.erb:12:in `_app_views_payments__list_html_erb__1381777750_2232227020' app/views/payments/update.js.erb:3:in `_app_views_payments_update_js_erb___1521001921_2232244240' app/controllers/payments_controller.rb:45:in `update'

ActionView::Template::Error (undefined method `each' for #<Payment: 0x10a3039e0>): 9: </tr> 10: </thead> 11: <tbody> 12: <% for payment in @payments do %>

It's saying that @payments is a Payment, not an array of them. This means that your statement:

  @payments = Payment.joins(:application_form).where('application_forms.status' =>'pending')

is returning a single Payment object. I don't know why it's doing that -- maybe it's correct behavior in the case of one result, but it seems to me a one-element array would be "least surprising". As a workaround you could try immediately after that:

  @payments = [@payments] if Payment === @payments

Let us know how that works for you.

Alternately, are you absolutely sure that nothing else is modifying @payments? Since you have both singular and plural versions, it's quite plausible that you added an s on some line where you didn't mean to. Try searching the controller, view, and partials for @payments and objectively inspecting each occurrence.


Also you can use ruby-debug to break into your code (after @payments = ... for example) and inspect the data to check it is correct. Similarly you can break into the code in the view to check it is still ok. Have a look at the Rails Guide on debugging to see how to do that, and also to see some other debugging techniques.