Ruby on rails 3 在最佳就地更新后更新各种DOM元素

Ruby on rails 3 在最佳就地更新后更新各种DOM元素,ruby-on-rails-3,best-in-place,Ruby On Rails 3,Best In Place,在使用best_in_place更新DOM元素后,表中有各种值需要更新。如何在最佳更新后触发名为“update.js.erb”的javascript操作,如“create.js.erb” 例如,我有一个商品价格表,我需要在用户更新单个商品数量后更新该表的“总计”字段。我见过许多人问这个问题,但没有找到令人满意的解决方案。我发现最好的方法是创建一个javascript函数,在ajax:success之后监视特定DOM元素的更新,然后使用jQuery更新指定的DOM元素 在被更新项的控制器中,我打包

在使用best_in_place更新DOM元素后,表中有各种值需要更新。如何在最佳更新后触发名为“update.js.erb”的javascript操作,如“create.js.erb”


例如,我有一个商品价格表,我需要在用户更新单个商品数量后更新该表的“总计”字段。

我见过许多人问这个问题,但没有找到令人满意的解决方案。我发现最好的方法是创建一个javascript函数,在ajax:success之后监视特定DOM元素的更新,然后使用jQuery更新指定的DOM元素

在被更新项的控制器中,我打包了一个JSON响应,其中包含javascript更新DOM元素所需的所有信息

您将看到我还将新表行的partial呈现为HTML字符串,并将此字符串与JSON响应一起传递

___Item Controller_____

    respond_to do |format|
  if @item.update_attributes(params[:item])

    #json response variables to refresh table row after update
    id = [@item]  
    new_row = render_to_string('items/_item.html', :layout => false, :locals => { :item => @item })
    #----------json-variables-----------#

    format.json { render :json => { new_row: new_row, id: id, :status => 200 }}
    format.js   
  else
    format.json { render :json => @item.errors.full_messages, :status => :unprocessable_entity }
    format.js
  end
end
然后在一个与页面一起加载的.js文件(如application.js)中,我包含了一个函数,用于监视类为“row_class”的表行的更新

$(document).ready(function(row_class, row_id_prefix){

$("." + row_class).on("ajax:success",function(event, data, status, xhr){
    var parsed_data = jQuery.parseJSON(data); //parses string returned by controller into json object

    var id = parsed_data["id"];
    var new_row = parsed_data["new_row"]; //this is an html string that replaces the existing table row

    $('tr#' + row_id_prefix + id).replaceWith(new_row);
    $('tr#' + row_id_prefix + id).effect('highlight');
    $('.best_in_place').best_in_place(); //activates in-place-editing for newly added content.      
}));        
您可以修改jQuery以更新所需的任何DOM元素。此外,如果您需要在对象上调用ruby方法的结果(如人化合计、税收合计等),您可以在控制器的JSON对象中将它们定义为变量


最终,如果best_in_place能够触发(在本例中)items/update.js.erb脚本,那将是最好的,但它看起来不像是路线图上的脚本。

我见过很多人问这个问题,但还没有找到满意的解决方案。我发现最好的方法是创建一个javascript函数,在ajax:success之后监视特定DOM元素的更新,然后使用jQuery更新指定的DOM元素

在被更新项的控制器中,我打包了一个JSON响应,其中包含javascript更新DOM元素所需的所有信息

您将看到我还将新表行的partial呈现为HTML字符串,并将此字符串与JSON响应一起传递

___Item Controller_____

    respond_to do |format|
  if @item.update_attributes(params[:item])

    #json response variables to refresh table row after update
    id = [@item]  
    new_row = render_to_string('items/_item.html', :layout => false, :locals => { :item => @item })
    #----------json-variables-----------#

    format.json { render :json => { new_row: new_row, id: id, :status => 200 }}
    format.js   
  else
    format.json { render :json => @item.errors.full_messages, :status => :unprocessable_entity }
    format.js
  end
end
然后在一个与页面一起加载的.js文件(如application.js)中,我包含了一个函数,用于监视类为“row_class”的表行的更新

$(document).ready(function(row_class, row_id_prefix){

$("." + row_class).on("ajax:success",function(event, data, status, xhr){
    var parsed_data = jQuery.parseJSON(data); //parses string returned by controller into json object

    var id = parsed_data["id"];
    var new_row = parsed_data["new_row"]; //this is an html string that replaces the existing table row

    $('tr#' + row_id_prefix + id).replaceWith(new_row);
    $('tr#' + row_id_prefix + id).effect('highlight');
    $('.best_in_place').best_in_place(); //activates in-place-editing for newly added content.      
}));        
您可以修改jQuery以更新所需的任何DOM元素。此外,如果您需要在对象上调用ruby方法的结果(如人化合计、税收合计等),您可以在控制器的JSON对象中将它们定义为变量


最终,如果“最佳位置”会触发(在本例中)items/update.js.erb脚本,这将是最好的,但它看起来不在路线图上。

考虑到我需要以不同的方式更新某些页面,这令人沮丧……这样做会打破其他页面(考虑到我需要以不同的方式更新某些页面,这是令人沮丧的……这样做会破坏其他页面。)(