Müsli
Müsli

Reputation: 1774

re render fields_for with ajax

I have a problem refreshing a partial with fields_for inside.

Here is the code of the partial ('table_detalle')

<table class="table">
    <thead>
        <tr>
            <th><%= t('.denominacion') %></th>
            <th><%= t('.cantidad_ingreso') %></th>
            <th><%= t('.importe') %></th>
        </tr>
    </thead>
    <tbody>

        <%= f.fields_for :operacion_detalles do |builder| %>
        <tr>
            <%= render 'table_detalle_operacion', f: builder %>
        </tr>
        <% end unless @operacion.nil? %>

    </tbody>
</table>
<%= content_tag :h3, t('.total', :value=> number_to_currency(@operacion.R_IMPORTE)).html_safe, :class => 'pull-right', style: 'display:inline'  %>

when the user change a value of a combo i would like to refresh the partial above (because the details objects must change and are editable)

Here is the javascript code:

$('#operacion_TIPOVALOR_ID').change(function(){
                      $.ajax({
                      url: '<%= cambiar_tipo_valor_movimientos_path %>',
                      data: {tipo_valor_id: $('#operacion_TIPOVALOR_ID').val()},
                      complete: function(){
                        $('#tipo_valor_loader').css('display','none');
                      },
                      beforeSend: function(){
                        $('#tipo_valor_loader').css('display','inline');
                      },
                      success: null,
                      dataType: 'script'
                    });
            });

the controller code:

def cambiar_tipo_valor
        @operacion = Operacion.new
        denominaciones = TipoValorDenominacion.all_from_tipo_valor params[:tipo_valor_id]
        denominaciones.each do |deno|
            @operacion.operacion_detalles.build :tipo_valor_denominacion => deno, :I_CANTIDAD => 0, :R_IMPORTE => 0
        end
    end

as you can see the "operacion_detalles" change depending on the user selection.

the .js.erb code:

$('#detalle').html('<%= escape_javascript(render :partial => 'table_detalle') %>');

But, i get:

undefined local variable or method `f' for #<#<Class:0x45ae1c8>:0x5062338>

So, i need the f variable to render the partial. Is there any way to emulate the f variable?

Thanks in advance.

Upvotes: 0

Views: 410

Answers (1)

M&#252;sli
M&#252;sli

Reputation: 1774

I had no other choice than resolve the problem by hand. What i mean?

Instead of a field_for => each_with_index:

    <% @operacion.operacion_detalles.each_with_index  do |detalle, index| %>
        <tr>
        <%= render 'table_detalle_operacion',  detalle: detalle, index: index  %>
        </tr>
    <% end -%>

The use the tags helpers like this:

<td>
    <input type="hidden" value="<%= detalle.tipo_valor_denominacion.R_MULTIPLICADOR %>" class="multiplicador"/>
    <%= hidden_field_tag "operacion[operacion_detalles_attributes][#{index}][TIPOVALORDENO_ID]", detalle.TIPOVALORDENO_ID %>
    <%= detalle.tipo_valor_denominacion.CTIPOVALORDENO %></td>
<td>
    <%= text_field_tag "operacion[operacion_detalles_attributes][#{index}][I_CANTIDAD]", detalle.I_CANTIDAD %>
    <%= content_tag(:span, detalle.errors[:I_CANTIDAD].join(', '), class: 'help-block') if detalle.errors.has_key? :I_CANTIDAD %>
</td>
<td>
    <%= hidden_field_tag "operacion[operacion_detalles_attributes][#{index}][R_IMPORTE]", detalle.R_IMPORTE %>
    <%= content_tag :span, number_to_currency(detalle.R_IMPORTE), class: 'detalle-importe pull-right' %>
    <%= content_tag(:span, detalle.errors[:R_IMPORTE].join(', '), class: 'help-block') if detalle.errors.has_key? :R_IMPORTE %>
</td>

In this case i had supply the names, so when this code is executed

$('#detalle').html('<%= escape_javascript(render :partial => 'table_detalle') %>')

It does not need the f variable.

Hope it helps.

pd: I know this is not a very good solution but it works.

Upvotes: 1

Related Questions