Rails:如何自定义Devise Confirmable模块?

3

我已经使用Devise设置了我的 Rails 应用程序,但它仍处于开发阶段。我还有一个 Thor 任务,用于创建默认的管理员用户。

问题是 Devise 不允许该管理员用户登录到网站,直到账户得到确认。是否有任何方法可以禁用确认模块来创建特定用户,例如管理员?

我的 Thor 任务:

class Setup < Thor
  desc "create_admin [EMAIL] [PASSWORD]", "Creates the administrative user."
  def create_admin(email = "admin@bogus.com", password = "testpassword123")
    require File.expand_path('config/environment.rb') # load Rails environment
    admin = User.create(:email => email, :password => password, :password_confirmation => password)
    admin.assign_role :admin
    puts "Admin user (#{ email }) created."
  end
end
3个回答

6
创建用户后,您可以在不直接更新数据库的情况下,在其上调用设备提供的confirm!方法。例如:
admin = User.create(:email => email, :password => password, :password_confirmation => password)
admin.assign_role :admin
admin.confirm!

这也有一个额外的好处,就是不需要将 confirmed_at 设为可访问属性,这样用户就可以在不经过实际确认流程的情况下自行确认。 - Kevin Ansfield
啊,谢谢你。我在种子数据中创建用户时传递了一个confirmed_at值,但它被忽略了。你必须通过confirm方法进行确认。 - jacklin

2

这应该可以工作

admin = User.create(:email => email, :password => password, :password_confirmation => password)

所以你的confirmed_at已经设置好了,这是devise在检查用户确认时引用的字段。

编辑

如果这看起来像个hack,请原谅我,但这对我似乎有效。执行上述命令后,

admin.update_attributes(:confirmed_at => Time.now)

我已经这样做了,但用户仍然被创建为 confirmed_atnil。怎么回事? - neezer
不,仍然注册为 nil - neezer
你的 update_attributes 没有起作用,但是如果我手动设置值并保存记录,它就可以:admin.confirmed_at = Time.now \ admin.save。为什么在 create 方法或 update_attributes 方法中指定时不起作用?这两种方法似乎比我刚才描述的手动操作更简洁... - neezer
1
好的,我感觉很蠢:我忘记在我的模型中(通过attr_accessible)将confirmed_at添加到我的可访问属性列表中。你的第一个方法现在按预期工作了。是我自己的问题。谢谢! - neezer
如果您将confirmed_at设置为可访问属性,那可能会非常危险,因为这将允许用户确认自己的帖子属性。请查看我的.confirm!方法,以更明智的方式处理此问题。 - Kevin Ansfield

-1

在用户或管理员模型中,只需添加注释:confirmable

devise :database_authenticatable, :recoverable, :rememberable, :trackable, #:confirmable...

在config/initializers/devise.rb文件中,你可以设置用户需要确认他们的帐户的时间。

我的管理员用户属于User类型;我仍然希望在除了管理员之外的每种User类型上使用:confirmable。 - neezer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接