我認爲圍繞AJAX的懷疑是有根據的。考慮到我們提供給您的應用程序的狹隘觀點,我們很難猜測可能發生了什麼。嘗試改變
redirect_to @url
到
if request.xhr?
render :update do |page|
page.redirect_to @url
end
else
redirect_to @url
end
而且,順便說一句,@url
可能有過多的範圍,給出的重定向。您可能最有可能使用url
。
編輯:
在我以前忽略的信息光,我敢肯定,以前的解決方案將解決此問題。基本上,一些瀏覽器對他們如何處理對xhr請求的響應更嚴格。使用標準的redirect_to,您可以發送xhr請求的「常規」響應。即使您有一個通常包含重定向代碼的* .js.rjs或* .js.erb,也會發生這種情況,因爲redirect_to調用會阻止代碼執行。如果您的應用程序的js已經優雅地降級,那麼您可能遲早會遇到此問題,因爲您似乎有好幾次。我發現了一些處理基本問題的好方法。
選項1:
一種方法是簡單地調整重定向到這個樣子:redirect_to(@url) unless request.xhr?
,然後適當的重定向邏輯添加到您的* .js.erb文件。除了重定向之外,如果您還需要運行其他JavaScript,此方法很好。
選項2:
另一種解決方案是行之有效的,以這樣的添加到您的應用程序控制器:
def redirect_to(args)
if request.xhr?
render js: "window.location = '#{ _compute_redirect_to_location args }'"
else
super args
end
end
這是很好的,因爲你並不需要篩選的和修改你現有的代碼,它只是開始在任何地方工作。另一個好處是,您仍然可以將重定向限定爲前一個選項,以允許使用更復雜的JavaScript。如果您想進一步擴展該方法並真正使其適用於您,您甚至可以發瘋,並添加一些其他特定於應用程序的選項,如閃光消息。
方案3:
如果你不重寫現有的方法了,你可以添加類似:
def firm_redirect_to(url)
if request.xhr?
render js: "window.location = '#{ url }'"
else
redirect_to url
end
end
但你必須修改所有的代碼。
我個人更喜歡選項2的變體......無論如何,希望這有助於 - 祝你好運。
如果添加狀態碼會怎麼樣?像redirect_to網址,狀態:301 – jibai31
仍然無法正常工作。Chrome檢查顯示紅色重定向,並表示它被取消。 –
Ajax或只是標準請求? –