ruby-on-rails – Ruby on Rails防止Turbolinks劫持AJAX操作
我正在按照RoR入门指南进行操作,并在我进行操作时添加一些内容.具体来说,我想要实现的是,在步骤
5.13 Deleting Articles中,我使用AJAX而不是使用标准模式删除了一篇文章.
我想以最符合RoR做事方式的方式这样做.阅读Working with JavaScript in Rails章后,以下步骤似乎是要走的路: >将属性remote:true添加到link_to帮助程序(请参阅代码段A) 片段A. <td><%= link_to 'Destroy',article_path(article),method: :delete,data: {turbolinks: false,remote: true},:class=> 'remove-article' %></td> 代码片段B. def destroy @article = Article.find(params[:id]) respond_to do |format| if @article.destroy format.html { redirect_to articles_path } format.json { render json: @article } else format.html { render action: "index" } format.json { render json: @article.errors,status: :unprocessable_entity } end end end 代码片段C. (function(){ $(document).on('turbolinks:load',listenForArticleDelete); function listenForArticleDelete() { $('a.remove-article').on('ajax:success',function(e,data,status,xhr) { // e.preventDefault(); console.log('DELETE: AJAX SUCCESS',e,'n',xhr); }); } })(); 这不像我预期的那样工作: > turbolinks禁用无效:它仍在替换整页内容. 我显然是这样做错了.有人可以向我解释我应该怎么做吗?即不只是如何让它工作,而且还以一种惯用的RoR方式? 编辑 我发现哪个部分是罪魁祸首:它是Snippet B,因为format.html是在format.json之前运行的.只需切换这两个就解决了这个问题: 修订后的片段A: <!-- Default delete -> format.html --> <td><%= link_to 'Destroy default',:class=> 'remove-article' %></td> <!-- aSync delete -> format.json --> <td><%= link_to 'Destroy aSync',remote: true,data: {turbolinks: false},:class=> 'remove-article' %></td> 修订后的片段B: def destroy @article = Article.find(params[:id]) respond_to do |format| if @article.destroy # Must place json before html,otherwise html will be executed format.json { render json: @article } format.html { redirect_to articles_path } else format.json { render json: @article.errors,status: :unprocessable_entity } format.html { render action: "index" } end end end 解决方法
我个人会以不同的方式来到这里.
视图: <td><%= link_to 'Destroy default',article,:remote => true,:class=> 'remove-article' %></td> 控制器: def destroy @article.destroy respond_to do |format| format.js end end 这将处理destroy方法并返回javascript,默认情况下,它将返回相关目录中的destroy.js.erb文件 destroy.js.erb: $("#article").slideToggle(300,function(){ $("#article").remove(); }); 仅供参考:http://api.jquery.com/slidetoggle/ 希望这有点帮助 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |