繁体   English   中英

Rails 通过 Ajax 远程删除和更新视图

[英]Rails remote delete and update view through Ajax

过去,每当我想通过 Ajax 更新视图的一部分时,我都会执行以下操作:

  1. 从我想要更新的部分中创建一个部分,并给它一个唯一的 ID,比如#tracks
  2. 在控制器中为该 Ajax 调用创建一个特殊操作,例如remove_track更新所有值等并添加format.js
  3. 创建一个与操作同名的新 JS 文件,以便 Rails 自动调用它remove_track.js.erb ,其中包含如下内容: $('#tracks').html("<%=j render 'cds/show_tracks' %>");
  4. 在调用此操作的链接中设置remote: true

所有这一切都很好,但现在我正尝试使用常规的destroy方法来删除和更新公共index视图以获得灵活性,这意味着我可以通过 Ajax 或正常调用此方法。 我认为这是一件很常见的事情,必须有比上述所有方法更好的方法。

我可以通过简单地将其放入控制器来获取 destroy 方法来调用我的destroy.js.erb文件:

  format.js { layout: false }

当然,在链接上设置remote: true

我不能做的是让视图刷新。 我要刷新的表被封装在一个具有唯一 ID 的 div 中,但由于它不是局部的,因此它拒绝刷新内容。 也许我错过了一些东西。

我注定要创建一个部分并使用上述方法刷新它,还是有更神奇的方法(除了使用 Turbolinks)?

谢谢。

PS另外,我刚刚注意到这有一个额外的缺点,即我无法将其余的参数传递给 destroy 方法,因为它只传递对象 ID 以使用常规 CRUD 路由进行销毁。 如果我尝试使用platform(action: destroy)platform(method: delete)我会收到错误消息:

No route matches {:action=>"destroy", :controller=>"platforms"}

这意味着如果我想传递这些参数,我必须创建一个新路由......

所有这一切的另一个缺点是,我在销毁方法中再次重复了索引方法中的所有搜索和排序逻辑。 我确定这绝对不是这样做的方法。

感谢这个页面,我找到了正确的方法。 如此简单有效。

http://carmennorahgraydean.blogspot.com.es/2012/10/rails-328-ajax-super-basic-example.html

更新 index.html.erb 中的 destroy 行:

 <%= link_to 'Destroy', pony, method: :delete, data: { confirm: 'Are you sure?' }, :remote => true, :class => 'delete_pony' %>

创建一个文件,destroy.js.erb,把它放在你的其他 .erb 文件旁边(在 app/views/ponies 下)。 它应该是这样的:

 $('.delete_pony').bind('ajax:success', function() { $(this).closest('tr').fadeOut(); });

将 format.js { render :layout => false } 添加到您的控制器:

 respond_to do |format| format.html { redirect_to ponies_url } format.json { head :no_content } format.js { render :layout => false } end

希望这对其他人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM