打我提出一個Ajax請求以下控制器方法結束:如何進行有效的瀏覽器重定向在控制器請求通過AJAX
def destroy
...
redirect_to "/courses"
end
控制檯顯示重定向和渲染工作,但瀏覽器實際上並沒有加載頁面(大概是因爲請求是由ajax而不是標準的HTTP製作的)。我想實際上瀏覽器加載/courses
頁面,我該怎麼做?
打我提出一個Ajax請求以下控制器方法結束:如何進行有效的瀏覽器重定向在控制器請求通過AJAX
def destroy
...
redirect_to "/courses"
end
控制檯顯示重定向和渲染工作,但瀏覽器實際上並沒有加載頁面(大概是因爲請求是由ajax而不是標準的HTTP製作的)。我想實際上瀏覽器加載/courses
頁面,我該怎麼做?
你想從你的客戶端JavaScript發送重定向在location.href像這樣:
$.ajax("/destroy")
.done(function() {
location.href="/courses";
});
我不知道你用什麼庫,供您Ajax調用,所以我只是用jQuery語法。
首先,您需要將路由更改爲destroy.js而不是銷燬。它會使rails呈現一個js模板而不是html模板。
= link_to 'Destroy', course_path(@course_id), method: :destroy, format: :js
然後,創建一個destroy.js.erb(或HAML如果這是你使用的是什麼),並添加有JavaScript代碼:
window.location.href = '/courses';
你應該考慮爲什麼使用AJAX在所有如果你反正重定向用戶瀏覽器:)
響應
底線是,你不能從一個Ajax再重定向任務 - 您必須在響應中容納重定向
Ajax基本上會嚮應用的後端發送「僞請求」。這個請求最好被描述爲相當「愚蠢」 - 它只能直接從初始請求中處理響應(僅此而已);這意味着如果你想處理重定向,你需要在瀏覽器端處理它。
我會看這樣做:
#app/controllers/courses_controller.rb
class CoursesController < ApplicationController
respond_to :js, only: :destroy
def destroy
@course = Course.find params[:id]
@course.destroy
end
end
#app/views/courses/destroy.js.erb
window.location.assign("<%=j courses_index_path %>");
這將是proessing的「重定向」的最有效途徑。它根本不會是一個重定向 - 只是JS基於特定時間的JS調用重新加載頁面!
最清潔的回覆,謝謝 – 2014-09-21 19:40:27