过去,每当我想通过Ajax更新视图的一部分时,我都会执行以下操作:
- 用我想要更新的零件创建一个零件,并给它一个唯一的ID,比如说
#tracks - 在控制器中为该Ajax调用创建一个特殊操作,比如说
remove\u track更新所有值,等等,然后添加format.js - 创建一个与该操作同名的新JS文件,以便Rails自动调用它
remove_track.JS.erb,该文件包含以下内容:$(“#tracks”).html(“<;%=j render'cds/show_tracks”%>;” - 在调用此操作的链接中设置
remote:true
所有这些都很好,但是现在我尝试使用常规的destroy方法来删除和更新一个常见的索引视图,以提高灵活性,这意味着我可以通过Ajax或正常调用此方法。我觉得这是一件很平常的事情,必须有一个比以上所有的更好的方法
我可以让destroy方法调用我的destroy.js.erb文件,只需将其放入控制器:
format.js{layout:false}
当然,在链接上设置remote:true
我不能做的是刷新视图。我要刷新的表被封装在一个具有唯一ID的div中,但由于它不是部分,所以拒绝刷新内容。也许我错过了什么
我是注定要创建一个部分并用上面的方法刷新它,还是有一种更神奇的方法来实现它(除了使用TurboLink)
谢谢
PS
此外,我刚刚注意到这还有一个额外的缺点,即我无法将其余的参数传递给destroy方法,因为它只使用常规CRUD路由传递要销毁的对象ID。如果我尝试使用平台(操作:销毁)或平台(方法:删除)我会得到一个错误:
没有路由匹配{:action=>;“destroy”,:controller=>;“platforms”}
这意味着如果我想传递这些参数,我必须创建一个新的路由
所有这一切的另一个缺点是,我将索引方法中的所有搜索和排序逻辑重新加载到destroy方法中。我确信这绝对不是这样做的
多亏了这一页,我找到了正确的方法。简单有效
http://carmennorahgraydean.blogspot.com.es/2012/10/rails-328-ajax-super-basic-example.html
更新index.html.erb中的销毁行:
<;%=链接到“销毁”,小马,方法::删除,数据:{确认: “你确定吗?”},:remote=>;true,:class=>;'删除第“%”项;创建一个文件destroy.js.erb,将其放在其他.erb文件旁边
(在应用程序/视图/小马下)。应该是这样的:$('.delete_-pony').bind('ajax:success',function(){ $(this).closest('tr').fadeOut(); });将format.js{render:layout=>false}添加到控制器:
响应待办事项|格式| format.html{redirect_to ponies_url} format.json{head:no_content} format.js{render:layout=>;false} 终止
希望这对其他人有帮助