使用Devise和(warden)回调进行Ruby On Rails身份验证

时间:2011-11-23 07:17:14

标签: ruby ruby-on-rails-3 devise activeadmin warden

我有一个使用Devise的rails应用程序,用户模型,没有范围。 我还在应用程序中添加了activeadmin gem,Active Admin是一个用于在应用程序中添加管理仪表板的gem。它使用Devise登录用户,并为管理员创建单独的admin_user模型。

我允许匿名的,未登录的用户创建购物车,创建session[:cart_id]。如果用户登录,我希望将用户与购物车相关联,例如

Cart.find(session[:cart_id]).user = current_user 

我打算使用Wardens回调wardens callbacks来暗示这一点,就像这样:

Warden::Manager.after_set_user :scope => :user do |user, auth, opts|

    Cart.find(session[:cart_id]).user = user 

end

但如果我这样做,我会收到错误:

<% unless user_signed_in? %>会抛出错误:admin_user user is not logged in

任何人都有任何想法发生了什么?

我看了相关的问题,但没有帮助:

How to access session from Warden/Devise after_authentication callback in Rails

Where should warden callbacks be placed in a rails app?

2 个答案:

答案 0 :(得分:2)

Active Admin使用的AdminUser模型也会执行此回调。所以,也许,if可以解决你的问题:

 Warden::Manager.after_set_user :scope => :user do |user, auth, opts|
   Cart.find(session[:cart_id]).user = user if user.class == User
 end

答案 1 :(得分:1)

实际上,事实证明问题是通过在设计初始化文件中设置warden中的默认范围来解决的。

  # Configure the default scope given to Warden. By default it's the first
  # devise role declared in your routes (usually :user).
  # config.default_scope = :user

由于活动管理路由已添加到我的用户的设计路由之上,因此adminuser成为默认用户。