目前我通过按钮点击进行Ajax调用,更新购物车,但是它发布的控制器应用了authenticate_user!
before_filter,这是我想要的,因为用户必须登录。
因为它是一个ajax调用,我通常只会遇到401
错误并且没有重定向,所以为了解决这个问题,我有:
$(document).on "ajaxError", (event, request, settings) ->
if request.status == 401
window.location.href = '/users/login'
然而,当我到达登录页面时,这导致我出现闪存[:notice]的问题,因为它已经丢失了。
通过在这里阅读各种帖子,我明白我可以使用flash.keep
来保持我的信息,但我认为这样做我将不得不改变处理重定向的方法。如果我可以在控制器中执行此操作,我也可以使用if request.xhr?
,不是吗?
我的问题是如何在保留authenticated_user!
辅助方法的所有现有功能的同时添加此功能。通过查看设计文档,帮助程序是动态构建的,不是吗?
我知道我可以帮助我的应用程序控制器:
def authenticate_user!
super
end
继续扩大,我尝试了
def authenticate_user!
if request.xhr?
respond_to do |format|
format.html { redirect_to new_user_session_path }
end
else
super
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)
我在控制台中收到此错误
Routing Error
No route matches [PUT] "/users/login"
不知道从哪里开始。
答案 0 :(得分:1)
从用户的角度来看,这听起来相当高。如果我点击“添加到购物车”,我希望将该东西添加到购物车中。我当然不希望被重定向到登录/注册页面。在这一点上,我会离开。
更好的方法是,如果用户未登录,请创建来宾用户并将其ID写入Cookie。访客用户有购物车,可以添加东西等。
然后,在结帐页面,您提供“登录”/“注册”选项。在任何一种情况下,您都会得到真正的用户。此时,您将迁移访客购物车并删除访客用户。
def current_or_guest_user
return guest_user unless current_user
# current user exists. And we found a guest user
if session[:guest_user_id]
transfer_guest_user_stuff # cart, posts and what-have-you
guest_user.destroy
session[:guest_user_id] = nil
end
current_user
end
def guest_user
unless @cached_guest_user
@cached_guest_user = User.find_or_create_by(id: session[:guest_user_id], is_guest: true)
session[:guest_user_id] = @cached_guest_user.id
end
@cached_guest_user
end
答案 1 :(得分:0)
作为第一条建议,你可以使用Trubolinks gem提供所有AJAX功能“in-box”,并且默认使用Rails 4 +。
作为第二条建议,您可以生成用户控制器(rails generate devise:controllers Users
)和\或设计会话等设计模块。使用Customize Devise Tools的密码和其他控制者。
此外,您可以在某些Controller的代码中自定义before_filter
,例如:
class TicketsController < ApplicationController
before_filter :store_location
before_filter :authenticate_user!, :only => [:new, :delete]
在此示例中,:authenticate_user
应仅适用于:new
和:delete
方法。其他方法不需要用户身份验证......
希望对你有所帮助!