设计 - 创建已确认的用户帐户而不发送电子邮件?

dis*_*dng 59 ruby-on-rails devise

我整合了与facebook的设计.现在,当用户使用他/她的Facebook帐户登录后创建用户帐户时,

  user = User.create(:email => data["email"], 
                     :password => Devise.friendly_token[0,20]) 
  user.confirmed_at = DateTime.now
  user.save!
Run Code Online (Sandbox Code Playgroud)

即使该帐户已被确认,仍会触发确认电子邮件.知道我怎么能把电子邮件关掉?

num*_*407 138

确认回调发生在创建之后,因此在confirmed_at手动设置之前,它发生在示例的第1行.

根据评论,最正确的做法是使用为此目的提供的方法#skip_confirmation!.confirmed_at手动设置将起作用,但它会绕过提供的API,这是应该尽可能避免的.

所以,像:

user = User.new(user_attrs)
user.skip_confirmation!
user.save!
Run Code Online (Sandbox Code Playgroud)

原始答案:

如果您confirmed_atcreate参数传递,则不应发送邮件,因为对帐户是否已"确认"的测试是查看是否设置了该日期.

User.create(
  :email => data['email'], 
  :password => Devise.friendly_token[0,20], 
  :confirmed_at => DateTime.now
)
Run Code Online (Sandbox Code Playgroud)

那,或者只是用来new代替create构建你的用户记录.

  • 使用User.new和user.skip_confirmation!避免必须使confirm_at可访问. (8认同)
  • @Khash不,重点是你需要在保存之前设置`confirmed_at`.简单地使用`new` over`create`不会改变任何东西,但是如果他使用`new`然后在保存之前设置`confirmed_at`,则不会发送电子邮件.实际上,所有`skip_confirmation!`都设置为`confirmed_at`. (2认同)

Ben*_*ier 11

如果您只是想阻止发送电子邮件,您可以使用#skip_confirmation_notification,如下所示:

user = User.new(your, args)
user.skip_confirmation_notification!
user.save!
Run Code Online (Sandbox Code Playgroud)

文档

跳过发送确认/再确认通知电子邮件after_create/after_update.与#skip_confirmation!不同,记录仍需要确认.