我有这个网上商店,你在一个页面上看到
products
; booking
; order
及其bookings
; booking
; booking
。 order.bookings
和products
都会在html页面上制作可能很长的列表。
整个预订仅由booking_controller工作。
booking_controller
的作用:
工作正常,只需使用 ruby 和html.erb
。
只有问题,这真的需要改变,显然是在每次重定向后,浏览器都会转到页面顶部。浏览器没有集中注意力。或者更好的说,浏览器应该保留,但不会。
我知道你在服务器端做所有这些事情,所以需要重新加载页面,或者说更好的数据刷新。我不想要的是在客户端(JS)再次构建这一整体。
在数据刷新重定向到页面上的完全相同位置后,我不能简单地说:。忽略异步请求会给出的所有困难,或者我是否夸大并且轻松一点JS?
答案 0 :(得分:2)
使用Rails,使用ajax非常容易,但是如果你根本不熟悉ajax,那么起初可能有点令人生畏。幸运的是,有很多关于这个主题的教程。基本上,将remote: true
选项添加到您的form_for语句中,rails会自动了解您是否希望它能够发布' POST'以JS格式请求。认识到传入的HTTP请求是JS格式是很重要的,因为您需要指定在控制器中处理该事件。如:
def create
#Do whatever saving and processing you need here
respond_to do |format|
format.html { redirect_to some_path_here }
format.js { } #By not adding anything in the brackets here, you're telling rails to fetch a js view file that follows standard rails convention and so it should be named 'create.js.erb'
end
然后在您的控制器的视图文件夹中创建视图文件create.js.erb
。在该文件中,您将要刷新页面中需要更新的任何部分,这通常涉及隐藏那里的旧div并在其位置附加部分。我通常在页面上留下一个带有ID的空div(在这种情况下是new_whatever_page.html.erb
,然后我在js.erb文件中调用它来附加部分:
在你的create.js.erb中添加:
$("#the-id-of-the-div-in-your-new-view-page").html("<%= escape_javascript(render 'order_table') %> #This basically says, find the div on the current page with a matching id and then append the partial named _order_table.html.erb to it.
现在只做一个名为
的部分
_order_table.html.erb
在相同的视图文件夹中,放置要插入或更新的内容。