自定义authenticate_user设计

时间:2015-12-24 11:05:57

标签: ruby-on-rails ruby ruby-on-rails-4 devise

目前我通过按钮点击进行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"

不知道从哪里开始。

2 个答案:

答案 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方法。其他方法不需要用户身份验证......

希望对你有所帮助!