用ajax重新渲染fields_for

时间:2012-10-12 15:45:04

标签: ruby-on-rails-3

我在使用fields_for刷新部分内容时出现问题。

以下是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'  %>

当用户更改组合的值时,我想刷新上面的部分(因为详细信息对象必须更改并且可以编辑)

以下是javascript代码:

$('#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'
                    });
            });

控制器代码:

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

您可以看到“operacion_detalles”根据用户选择而变化。

.js.erb代码:

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

但是,我明白了:

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

所以,我需要f变量来渲染部分。有没有办法模拟f变量?

提前致谢。

1 个答案:

答案 0 :(得分:1)

我别无选择,只能手工解决问题。我的意思是什么?

而不是field_for =&gt; each_with_index:

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

使用像这样的标签助手:

<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>

在这种情况下,我提供了名称,所以当执行此代码时

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

它不需要f变量。

希望它有所帮助。

pd:我知道这不是一个很好的解决方案,但它有效。