过去,每当我想通过 Ajax 更新部分视图时,我都会执行以下操作:
- 从我要更新的部分中创建一个部分并给它一个唯一的 ID,比如说
#tracks
- 在控制器中为该 Ajax 调用创建一个特殊操作,例如
remove_track
更新所有值等并添加format.js
- 创建一个与操作同名的新 JS 文件,以便 Rails 自动调用它
remove_track.js.erb
,其中包含以下内容:$('#tracks').html("<%=j render 'cds/show_tracks' %>");
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方法中的所有搜索和排序逻辑。我确信这绝对不是这样做的方法。