如何在401 ajaxerror之后实现coffeescript工作?

时间:2017-12-02 17:14:23

标签: javascript jquery ruby-on-rails devise coffeescript

我正在构建一个reddit / angellist克隆。我希望能够在没有页面重新加载的情况下进行upvote和downvote。我通过votescontroller进行了ajax设置:

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('!')和alert('!')在application.jsvotes.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

1 个答案:

答案 0 :(得分:0)

经过一小段休息,我回来后开始研究其他一些我以前没见过的问题。

此处的解决方案:https://stackoverflow.com/a/45168313/6430382

创建方法&amp;在before_action :authenticate_user!

之上(之前)实施
def check_user
  return if user_signed_in?
  redirect_to new_user_session_path, error: 'You must log on to view this part of the site'
end

添加到控制器

class VotesController < ApplicationController
  before_action :check_user

  ...
end