【发布时间】:2016-02-18 02:38:22
【问题描述】:
我刚刚开始开发 Rails 4 (4.2.3) 应用程序,我使用 Devise 进行用户身份验证。我希望用户能够在注册 upp 之前通过创建一个测试项目并以访客用户身份登录来使用该应用程序。当用户注册(或注册)时,我想将测试项目分配给新的当前用户。
我一直在关注 Platformatec 的指南:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user
创建来宾用户有效,但在注册或使用活动的来宾用户会话时,我收到以下错误:
Filter chain halted as :require_no_authentication rendered or redirected
如果我清除我的会话,它会起作用。管理我的访客用户的方法如下所示:
def current_or_guest_user
if current_user
if session[:guest_user_id] && session[:guest_user_id] != current_user.id
logging_in
guest_user(with_retry = false).try(:destroy)
session[:guest_user_id] = nil
end
current_user
else
guest_user
end
end
如前所述,创建来宾用户似乎工作得很好。但这种逻辑永远不会发生:
# should delete the guest user and clear the session.
if current_user
if session[:guest_user_id] && session[:guest_user_id] != current_user.id
logging_in
guest_user(with_retry = false).try(:destroy)
session[:guest_user_id] = nil
end
current_user
我很确定我的来宾用户会话与我的新用户冲突并导致此设计错误(因为来宾用户在注册时永远不会被删除):
Filter chain halted as :require_no_authentication rendered or redirected
我的访客用户逻辑的其余部分看起来或多或少与此链接指南完全相同:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user。我还添加了身份验证段落/示例中的代码:https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user#authentication-this-may-interfere-with-the-current_user-helper。
关于我缺少什么的任何想法,以及如何让我的current_or_guest_user 在使用 Devise 时删除注册和签名的来宾用户?
更新
这是我的路线目前的样子:
devise_for :users, controllers: { sessions: "users/sessions", registrations: "users/registrations" }
root :to => 'public#index'
resources :apps
get 'users/show', to: "users#show"
get 'users', to: "users#index"
post 'guests/receive_guest', to: "guests#receive_guest"
更新 2
该指南有以下声明:
当(如果)用户注册或登录时,我们会删除访客用户 并清除会话变量。
它并没有解释如何以及在哪里做。我猜我必须再次致电current_or_guest_user。但我不确定在哪里,因为我对 Devise 不太熟悉。
更新 3
为了更清楚一点。这是我想要实现的步骤。
- 用户创建一个测试项目。
- 创建测试项目后,会创建来宾用户和会话。一旦会话结束或#3,访客用户应该被删除。
- 如果来宾用户注册,他/她应该登录并且测试项目应该分配给新的真实用户。
- 应该删除来宾用户。
【问题讨论】:
-
你能发布你的
routes.rb文件吗? -
@huzefabiyawarwala 我已经做到了。
-
我已经尝试了与您尝试在我的机器上实现的相同的方法,并且效果很好,因此除了设计之外,您编写的附加代码中可能缺少某些内容。如果可能,请删除上面的代码并发布您当前拥有的确切控制器。那会更容易调试。
-
你能更新你的
guest_user(with_retry = false).try(:destroy)行来喜欢那个guest_user(with_retry = false).reload.try(:destroy) -
@KhAmmad 我可以。然而,问题是这个 if 语句
session[:guest_user_id] && session[:guest_user_id] != current_user.id目前永远不会成为真的。我猜我必须再次致电current_or_guest_user,但我不确定何时何地。
标签: ruby-on-rails ruby ruby-on-rails-4 authentication devise