我正在構建一個reddit/angellist克隆。我希望能夠upvote和downvote沒有頁面重新加載。我通過votescontroller已經阿賈克斯設置:如何實現coffeescript在401 ajaxerror之後工作?
respond_to do |format|
format.html { redirect_to request.referer }
format.js
end
然後在upvote.js.erb:
$(document).ready(function(e) {
$("#vote-sum").html("<%= pluralize(@votable.votes.sum(:value), 'vote') %>");
});
到目前爲止都很好。點擊時立即變化。
這一切都發生在用戶登錄時。當用戶沒有登錄,並按下上行鏈接時,我得到401
,因爲我使用Devise我在我的票控制器中有before_action :authenticate_user!
。我得到這個作爲我的本地服務器上的輸出:
Started POST "/items/11/upvote" for 127.0.0.1 at 2017-12-02 17:52:06 +0100
Processing by VotesController#upvote as JS
Parameters: {"item_id"=>"11"}
Item Load (1.2ms) SELECT "items".* FROM "items" WHERE "items"."id" = $1 ORDER BY "items"."created_at" DESC LIMIT $2 [["id", 11], ["LIMIT", 1]]
Completed 401 Unauthorized in 24ms (ActiveRecord: 1.2ms)
我想自動發送用戶登錄頁面。所以,我用Google搜索的答案,發現一個,具有極大的答案:
https://stackoverflow.com/a/10460074/6430382
我要插入幾行代碼:
$ ->
$("a").bind "ajax:error", (event, jqXHR, ajaxSettings, thrownError) ->
if jqXHR.status == 401 # thrownError is 'Unauthorized'
window.location.replace('/users/sign_in') // or with .replace(this)
然而,當我將這些行添加這是行不通的。我將$("a")
更改爲$(document)
。甚至改變了這種香草JS:
$(function() {
return $(document).bind("ajax:error", function(event, jqXHR, ajaxSettings, thrownError) {
if (jqXHR.status === 401) {
return window.location.replace('/users/sign_in');
}
});
});
旁註:一個正常的console.log( '!')和警報( '!')工作在application.js
或votes.coffee
代碼罰款。
我希望代碼將用戶重定向到頁面中的設計符號。
其他類似的資源,我已經看了:
https://stackoverflow.com/a/34434921/6430382
https://stackoverflow.com/a/9903564/6430382
Devise authenticate_user! breaks when making remote: true requests to a non-devise controller action