我试图通过Javascript或Ruby on Rails代码对新位置进行排序后重新加载页面。
$("#serialize").click ->
c = set: JSON.stringify($("#sortable").nestedSortable("toHierarchy",
startDepthCount: 0
))
$.post "savesort", c, $("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
false
我想在这里添加
$.post "savesort", c, $("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
window.location.reload(false);
false
但似乎搞砸了订单。这是我的rails代码
class SiteController < ApplicationController
def savesort
neworder = JSON.parse(params[:set])
prev_item = nil
neworder.each do |item|
dbitem = Category.find(item['id'])
prev_item.nil? ? dbitem.move_to_root : dbitem.move_to_right_of(prev_item)
sort_children(item, dbitem) unless item['children'].nil?
prev_item = dbitem
end
Category.rebuild!
render :nothing => true
end
end
我也在考虑改变渲染:没有=&gt;对redirect_to root_url是真的,但这似乎也不起作用。
这是我的Routes.rb(为了空间而缩短)
locksmithing::Application.routes.draw do
get "site/home"
match "/savesort" => 'site#savesort'
root to: 'site#home'
end
那么,我应该在哪里添加代码来刷新页面? Javascript还是在站点控制器中?还是有另一种解决方案?提前谢谢。
答案 0 :(得分:4)
首先,您的$.post
来电并没有达到预期的效果。这样:
$.post "savesort", c, $("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
与此相同:
$.post "savesort", c
我认为你的意图是在异步$('#output').html()
调用完成时执行$.post
但你需要一个回调函数。这部分$.post
:
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
将在构建$.post
调用时执行,其返回值将是$.post
将不知道如何处理的jQuery对象。要解决这个问题,只需将回调包装在回调中:
$.post "savesort", c, ->
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
如果您在window.location.reload(false)
之后立即放置$.post
,那么您将在POST完成之前重新加载页面,这可能不是您想要做的,这可以解释您的“混乱的订单”问题。尝试将其移入$.post
回调,以便在 POST完成后执行:
$.post "savesort", c, ->
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
window.location.reload(false)
您的原始代码完全忽略了SiteController#savesort
的响应,因此如果它没有返回任何内容,返回内容或重定向,则无关紧要。上面的回调更改仍然会忽略控制器返回的内容但是没关系,:nothing => true
对它来说是明智的。
一旦完成所有工作,您可以通过让控制器返回要插入页面的新数据来替换重新加载,然后$.post
回调可以将新数据插入到页面中。这将是一个非常标准的AJAX方法。
答案 1 :(得分:2)
由于您post
到您的服务器,您的服务器可以发送一小部分,只重新呈现更改的页面部分。
调整您的控制器操作,而不是声明任何渲染/重定向操作:
class SiteController < ApplicationController
def savesort
neworder = JSON.parse(params[:set])
prev_item = nil
neworder.each do |item|
dbitem = Category.find(item['id'])
prev_item.nil? ? dbitem.move_to_root : dbitem.move_to_right_of(prev_item)
sort_children(item, dbitem) unless item['children'].nil?
prev_item = dbitem
end
Category.rebuild!
end
end
现在将查找名为savesort.js.erb
的默认视图。在该视图中,您可以执行任何操作来覆盖类别列表。
此文件包含在浏览器中执行的纯JavaScript,例如:
$("#output").html("<p id=\"flash_notice\">Saved Successfully</p>")
当然,实际上你会希望它也会更新屏幕的更多相关部分。
到目前为止,这是首选方式。这只会对屏幕进行部分更新,并且会对用户产生最大的响应。