过去,每当我想通过Ajax更新视图的一部分时,我都会执行以下操作:
- 将要更新的那部分创建为局部并赋予其唯一的ID,例如
#tracks
- 在控制器中为该Ajax调用创建一个特殊的操作,例如
remove_track
,用于更新所有的值等,并添加format.js
- 创建一个与该操作同名的新JS文件,以便Rails自动调用它,例如
remove_track.js.erb
,其中包含类似这样的内容:$('#tracks').html("<%=j render 'cds/show_tracks' %>");
- 在调用此操作的链接中设置
remote: true
。
这一切都很好,但现在我正在尝试使用常规的 destroy
方法删除和更新公共的 index
视图,以获取灵活性,也就是说,我可以通过Ajax或正常方式调用此方法。 我想这是一件非常普通的事情,一定有比以上所有方法更好的方法。
我可以通过将下面的内容放入控制器中来使 destroy 方法调用我的 destroy.js.erb
文件:
format.js { layout: false }
当然还需要在链接上设置remote: true
。
我无法让视图刷新。我想要刷新的表格被包含在一个具有唯一ID的 div 中,但由于它不是部分视图,所以它拒绝刷新内容。也许我漏掉了什么。
我必须创建一个部分视图并使用上述方法来刷新它吗?还是有更神奇的方法可以实现(除了使用Turbolinks)?
谢谢。
PS此外,我刚注意到这样做的缺点是我不能将其余的参数传递给销毁方法,因为它只使用常规 CRUD 路由传递对象ID 来销毁。如果我尝试使用platform(action: destroy)
或platform(method: delete)
,就会出现错误:
No route matches {:action=>"destroy", :controller=>"platforms"}
这意味着如果我想传递这些参数,我必须创建一个新的路由...
但是所有这些的另一个缺点是,我在destroy方法中再次重复了我在index方法中进行搜索和排序的所有逻辑。我确定这绝对不是正确的做法。