如何在 Devise 中手动创建新用户和用户会话?
Posted
技术标签:
【中文标题】如何在 Devise 中手动创建新用户和用户会话?【英文标题】:How to manually create a new user and user session in Devise? 【发布时间】:2011-06-07 07:54:49 【问题描述】:我有一个表单,用于在 Rails 中收集大量信息。此表单的一部分是供新用户注册的字段。由于 Devise 具有专门用于创建新用户的控制器/操作,因此我不知道如何以编程方式以完全不同的操作创建用户,该操作也会创建另一条记录。我真的不能将用户注册表单分开。我不知道如何创建用户,然后让用户登录,就像我在 Authlogic 中可以轻松做到的那样。
我使用过 Authlogic 和 Devise,并且认为它们各有优缺点。使用 Devise,我喜欢“开始”一个新项目的速度有多快,但定制它似乎很痛苦。不久前,Authlogic 在 Rails 3 上遇到了很多问题,所以我改用了 Devise。我现在正在做一个新项目,并从头开始。
所以我认为这个问题有 2 个可能的答案:(a) 如何在 Devise 中执行此操作,或者 (b) 为什么我应该改用 Rails 3 切换到 Authlogic。
【问题讨论】:
您接受的答案适用于 Devise 和 Authlogic。 【参考方案1】:您可以通过创建新用户模型来创建新的 Devise 用户(请参阅https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface)
@user = User.new(:email => 'test@example.com', :password => 'password', :password_confirmation => 'password')
@user.save
要登录新创建的用户,请使用sign_in @user
【讨论】:
完全相同的代码也适用于 Authlogic(我正在运行版本 1.4.4.1)。 这方面的文档在哪里......就像一个人如何知道一个名为 sign_in 的函数存在 你可以在github.com/plataformatec/devise自述文件的“测试助手”部分看到它更具体地说,你可以在这里看到文档:rubydoc.info/github/plataformatec/devise/master/frames【参考方案2】:在登录前保存新创建的用户将失败,因为设计尚未填写用户对象的必填字段。所以大卫的代码将适用于当前页面,但下一页不会获得登录用户,因为用户只有在会话设置后才会保存。使用Mongoid时会出现这种情况,不知道是不是Mongodb特有的问题。
为了解决这个问题,我有一个非常不完美的解决方案来调用sign_in 两次。第一个登录将保存用户。它只是有效,但人们当然可以改进它。
@user = User.new(:email => 'test@example.com',
:password => 'password',
:password_confirmation => 'password')
# This will save the user in db with fields for devise
sign_in @user
# :bypass is set to ignore devise related callbacks and only save the
# user into session.
sign_in @user, :bypass => true
【讨论】:
请问如果您在调用 sign_in 之前明确保存用户,问题是否仍然存在?如果这不起作用,是否在保存后但在登录之前添加重新加载用户的调用?【参考方案3】:对于看到这个问题的新人...
一个简单的方法是在你的
config/routes.rb
你应该有如下一行:
devise_for :users
所以,您只需添加设计将使用的路径前缀:
devise_for :users, :path_prefix =>'auth'
希望对你有帮助!
【讨论】:
以上是关于如何在 Devise 中手动创建新用户和用户会话?的主要内容,如果未能解决你的问题,请参考以下文章
Rails - 如何覆盖设计SessionsController以在用户登录时执行特定任务?