我在使用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变量?
提前致谢。
答案 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:我知道这不是一个很好的解决方案,但它有效。