2017-01-09 16 views
0

我有一个Rails应用程序,让用户右键单击DOM项目以获取使用工具jQuery-contextMenu实现的上下文菜单。当用户点击该菜单中的项目时,将执行Rails操作。到目前为止,所有这些实际上都起作用。然后我希望页面能够随着数据的改变状态而刷新。 Rails的调试控制台声称页面显示正确,但我的浏览器没有显示任何区别。我究竟做错了什么?jQuery执行Rails命令但不显示结果

这是我的HTML页面中代表上下文菜单的脚本。如果您单击deletenode选项,则会发出$ .post请求。

<script> 
    $(function(){ 
     $('#treemenu').contextMenu({ 
      selector: 'span', 
      callback: function(key, options) 
      { 
       var nodeID = parseInt($(this).attr("id").substring(13), 10); 
       if(key == "deletenode") 
       { 
        $.post("/ontology/" + nodeID + "/delnode", { _method: 'post' }); 
       } 
       else if(key == "deletearc") 
       { 
       } 
       else 
       { 
       } 
//    window.console && console.log(m) || alert(m); 
      }, 
      items: 
      { 
       "deletenode": {name: "<%= t('ontologies.delete.delete_node') %>"}, 
       "deletearc": {name: "<%= t('ontologies.delete.delete_arc') %>"}, 
      } 
     }); 
    }); 
</script> 

由于Rails的路线,这导致这个Rails应用的控制器

def delnode 
    logger.debug 'Entered delnode ' + params[:id] 
    redirect_to ontologies_url, alert: 'testing delnode.' 
end 

这是调试器控制台上的输出。正如它说完成200,它实际上应该是好的。但重定向到索引操作实际上并没有发生。

Started POST "/ontology/1/delnode" for ::1 at 2017-01-08 19:04:52 -0800 
Processing by OntologiesController#delnode as */* 
    Parameters: {"id"=>"1"} 
    User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]] 
Entered delnode 1 
Completed 200 OK in 5ms (Views: 0.5ms | ActiveRecord: 1.0ms) 

我尝试了很多不同的东西在其他帖子中建议,但没有任何结果显示页面。感谢您的帮助。

回答

2

delnode从ajax请求中调用路由和方法。所以,redirect_to方法将呈现一个302代码,它不会被回调处理。

一个可能的解决方案是呈现200代码(操作成功,如:“好的,我删除了该节点”),并在回调中使用重定向处理成功。

类似的东西:

导轨:

def delnode 
    logger.debug 'Entered delnode ' + params[:id] 
    #destroy logic... 
    #if ok: 
    head 200 #renders nothing 
end 

JS:

$.post("/ontology/" + nodeID + "/delnode", { _method: 'post' }).done(function(data, textStatus, jqXHR) { 
    location.reload(); //javascript refresh your page 
}); 
+1

谢谢你,mrlew。这很好地解决了这个问题。 –

1

在AJAX请求,您不能在控制器使用redirect_to的方法。 您可以渲染HTML代码,模型中的数据或控制器中的任何内容。

所以使用代码:

render :nothing => true 

render data: {status: true}.to_json 

在JS:

$.post("/ontology/" + nodeID + "/delnode", { _method: 'post' }).done(function(response) { 
    console.log("response: "+ response.status) //you will get true in response 
    window.location.reload(); //reload the page if you want to reload 
}) 
+0

谢谢你,puneet18。这也解决了这个问题。 –