12

过去,每当我想通过 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在调用此操作的链接中设置。

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

只需将其放入控制器中,我就可以让 destroy 方法调用我的destroy.js.erb文件:

  format.js { layout: false }

当然还有remote: true链接上的设置。

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

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

谢谢。

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

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

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

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

4

1 回答 1

28

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

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

希望这对其他人有帮助。

于 2013-07-19T09:50:22.083 回答