我希望我的用户能够通过仅提供电子邮件地址来“订阅”,而不必强迫他们使用密码注册,除非他们愿意。
我可以添加自己的验证设置以允许此操作,但我怀疑如果我开始添加没有密码的用户或使用我自己的“未注册”字段标记它们,它会干扰Devise其余部分的工作方式。
目前最简单的解决方案似乎是将这些用户放在一个不同的表中,但这有一点点气味。有什么想法吗?
答案 0 :(得分:20)
我有一个类似的应用程序 - 我们使用Open ID和OAuth专门用于登录,当我们存储用户的电子邮件地址(Google帐户或Facebook在身份验证期间将其发回)时,他们从不登录使用它,所以不要有/需要密码。
这是对用户通过Facebook注册时发生的事情的回调:
User.create!( :facebook_id => access_token['uid'],
:email => data["email"],
:name => data["name"],
:password => Devise.friendly_token[0,20])
Devise.friendly_token[...]
只为用户生成一个随机的20个字符的密码,我们正在使用我们的默认用户模型和设计。只是以类似的方式在用户上设置密码将是我的方法,因为您永远不会使用他们的密码。此外,如果您改变主意并希望他们能够登录,您只需更改数据库中的用户密码并构建登录表单,设计将负责其余部分。
答案 1 :(得分:2)
Brett回答的另一个选择是覆盖password_required?用户模型上的方法。
def password_required?
super && provider.blank?
end
如果你存储了多个omniauth提供者,那么这样的事情也应该有效。
def password_required?
super && self.omniauth_credentials.empty?
end
对于此解决方案,Ryan Bates对Devise和Omniauth的轨道广播完全赞同:http://railscasts.com/episodes/235-devise-and-omniauth-revised