3

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

我允许匿名、未登录的用户创建购物车,创建一个session[:cart_id]. 如果用户登录我想将用户与购物车相关联,例如

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

我打算使用 Wardens callbacks 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

有人知道发生了什么吗?

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

如何从 Rails 中的 Warden/Devise after_authentication 回调访问会话

守望者回调应该放置在 Rails 应用程序中的什么位置?

4

2 回答 2

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
于 2011-12-03T16:27:22.753 回答
2

实际上,问题是通过在设计初始化文件中设置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

由于在我的用户的设计路由上方添加了活动管理员路由,因此管理员用户成为默认用户。

于 2012-02-14T14:44:13.287 回答