如何在Devise中手动创建新的用户和用户会话?

时间:2011-01-11 17:30:28

标签: ruby-on-rails ruby-on-rails-3 authlogic devise

我有一个表单,我在Rails中收集了大量信息。此表单的一部分是要注册的新用户的字段。由于Devise具有专门用于创建新用户的控制器/操作,因此我不知道如何以完全不同的操作以编程方式创建用户,同时创建另一个记录。我真的不能将用户注册表分开。我无法弄清楚如何创建用户,然后将用户登录,就像我在Authlogic中可以轻松做的那样。

我使用了Authlogic和Devise,并认为每个都有自己的优点和缺点。有了Devise,我喜欢用新项目“开始”的速度有多快,但定制它似乎很痛苦。一段时间后,Authlogic对Rails 3有很多问题,我转而使用Devise。我现在正在开发一个新项目并从头开始。

所以我认为这个问题有2个可能的答案:(a)如何在Devise中做到这一点,或者(b)为什么我应该用Rails 3切换到Authlogic。

3 个答案:

答案 0 :(得分:83)

您只需创建新的用户模型即可创建新的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

答案 1 :(得分:8)

在sign_in之前保存新创建的用户将失败,因为设计尚未填充用户对象的必填字段。因此,David的代码将适用于当前页面,但下一页将无法获得已登录用户,因为用户仅在设置会话后保存。当我使用Mongoid时会发生这种情况,我不知道它是否是Mongodb特有的问题。

为了解决这个问题,我有一个非常不完美的解决方案,可以两次调用sign_in。第一个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 

答案 2 :(得分:4)

对于看到这个问题的新人......

执行此操作的简单方法是在

config/routes.rb

你应该有如下一行:

devise_for :users

所以,你只需添加一个设计将使用的路径前缀:

devise_for :users, :path_prefix =>'auth'

希望它有所帮助!