【问题标题】:Authenticate user, redirect with XHR request验证用户,使用 XHR 请求重定向
【发布时间】:2019-05-21 07:10:07
【问题描述】:

我正在查看 this guide 以帮助我在我的应用程序中设置“添加到购物车”功能。

在指南中,作者只允许用户在登录后添加到购物篮(这也意味着该按钮在此之前不可见),但我不想受此限制,所以“添加到购物车”将始终可见,但如果您未登录,则单击时,您将被重定向到登录/注册页面。

在控制器中,我们使用before_filter :authenticate_user!,默认情况下,一旦您注册/登录,它将重定向回您来自的页面(或者我相信,如果这不正确,请告知)。

我遇到的问题是通过 XHR 请求来实现这一点。这是目前的设置

class CartsController < ApplicationController
  before_action :authenticate_user!
  def show
    cart_ids = $redis.smembers current_user_cart
    @cart_images = Image.find(cart_ids)
  end

  def add
    $redis.sadd current_user_cart, params[:image_id]
    render json: current_user.cart_count, status: 200
  end

  def remove
    $redis.srem current_user_cart, params[:image_id]
    render json: current_user.cart_count, status: 200
  end

  private

  def current_user_cart
    "cart#{current_user.id}"
  end
end

查看

<%=link_to "", data: { target: @cart_action, addUrl: add_to_cart_path(@image), removeUrl: remove_from_cart_path(@image) } do %>
  <i class="di-shopping-cart-up"></i>
  <span><%= @cart_action %></span> Cart
<% end %>

咖啡脚本

$(window).load ->
  $('a[data-target]').click (e) ->
    e.preventDefault()
    $this = $(this)
    if $this.data('target') == 'Add to'
      url = $this.data('addurl')
      new_target = "Remove from"
   else
    url = $this.data('removeurl')
    new_target = "Add to"
  $.ajax url: url, type: 'put', success: (data) ->
  $('.badge-number').html(data)
  $this.find('span').html(new_target)
  $this.data('target', new_target)

当我点击“添加到购物车”时发生的情况是请求失败,控制台中出现401 Unauthorized,响应为You need to sign in or sign up before continuing.

我该如何处理?

【问题讨论】:

  • 在您的终端中,是否会记录类似警告:无法验证 CSRF 令牌真实性?
  • 不,看不到类似的东西
  • 你已经登录了吗?
  • 我没有登录,如果我没有登录,我想被重定向

标签: javascript ruby-on-rails ajax ruby-on-rails-4 coffeescript


【解决方案1】:

您应该在 ajax 响应中捕获 401,然后像这样重定向:

  $(document).on "ajaxError", (event, request, settings) ->
    if request.status == 401
      window.location.href = '/'

【讨论】:

  • 谢谢,请原谅我的进一步问题,但您提供的内容将出现在 $.ajax url: url, type: 'put', success: (data) -&gt; 之后,目前还不确定如何将其集成到当前的咖啡脚本中
  • 您可以像我在示例中那样绑定'ajaxError',或者将succes: (data) -&gt;error: (data) -&gt; 添加到您自己的调用中
  • 啊,我明白了,好吧,这确实有效,但现在我已经失去了 authenticated_user 的行为,它会将您重定向回我登录后的页面。这是可以的吗?取得成就?谢谢
  • 不,我的意思是authenticated_user 会将您重定向到登录页面,例如,一旦您完成登录,您通常会被重定向回您来自的地方,通过这个实现(我谢谢你)我刚刚回到主页,如果我改变window.location.href没关系......我想我需要看看控制器内的解决方案
  • 我发现了这个,我相信这将有助于stackoverflow.com/questions/10124832/…
猜你喜欢
  • 2017-03-09
  • 1970-01-01
  • 2018-03-03
  • 2019-01-13
  • 2011-01-29
  • 2012-05-03
  • 2011-11-08
  • 2021-01-26
相关资源
最近更新 更多