0

我在用 fields_for 刷新部分时遇到问题。

这是部分('table_detelle')的代码

<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 变量?

提前致谢。

4

1 回答 1

1

我别无选择,只能手动解决问题。我的意思是说?

而不是 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 -%>

像这样使用标签助手:

<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: I know this is not a very good solution but it works.

于 2012-10-16T11:08:38.720 回答