我有一个使用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
答案 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成为默认用户。