如何使用Devise跳过确认电子邮件地址更新的步骤?

33

我正在使用railsdevise confirmable

通常我希望用户确认其电子邮件地址,但有时我需要代表现有用户手动更改电子邮件,并且我想跳过发送确认电子邮件的步骤。

创建新用户时,可以使用以下方法跳过确认电子邮件:


```ruby User.create(email: 'user@example.com', confirmed_at: Time.now) ```
user.skip_confirmation!

...但是这似乎对于已经存在且已被确认的用户无效 - 因为电子邮件属性未被更新,devise仍需要用户确认新电子邮件并发送确认电子邮件:

@user = User.find_by_email('bob@site.example')
@user.email = 'dead@site.example'
@user.skip_confirmation!
@user.save!
6个回答

97

您想要使用的方法是skip_reconfirmation!(请注意reconfirmation中的 re )。

@user = User.find_by_email('bob@site.example')
@user.email = 'dead@site.example'
@user.skip_email_changed_notification!
@user.save!

太棒了!这太疯狂了... skip_confirmation!也应该包括这种情况!感谢分享! - estani
1
注意:代码示例错误地被编辑为包含skip_email_changed_notification!而不是正确的skip_reconfirmation!。看起来是基于误解的。Devise代码中有两个地方会在电子邮件更改时发送电子邮件,而原始问题是关于::Confirmable中的一个地方,通过使用skip_reconfirmation!来跳过;它没有被更改为skip_email_changed_notification!在Devise中。 - undefined

16

尝试将Devise.reconfirmableUser.reconfirmable(或你的模型名称)设置为false。你可以在config/initializers/devise.rb文件中的这一行进行设置:

# If true, requires any email changes to be confirmed (exctly the same way as
# initial account confirmation) to be applied. Requires additional unconfirmed_email
# db field (see migrations). Until confirmed new email is stored in
# unconfirmed email column, and copied to email column on successful confirmation.
config.reconfirmable = true

你还可以使用Active Record的update_column方法,该方法可以在不运行回调或验证的情况下保存字段。


我想要可重新确认的功能,我的意思是在更新现有用户记录的电子邮件时有跳过可重新确认的能力。 - AnApprentice

7
您可以在模型# models/users.rb中使用以下代码。这将禁用更新时的电子邮件重新确认:
def postpone_email_change?
  false 
end

或者在您的控制器中。
def update
  user.email = params[:user][:email]
  user.skip_confirmation_notification!

  if user.save
    user.confirm
  end
end

1
如果您只想跳过电子邮件通知,请按照以下步骤操作:
@user.skip_confirmation_notification!
@user.save

1

如果您需要跳过对特定用户的重新确认,可以采取以下步骤:

user = User.find_by(email: 'some.email@example.com')
user.email = 'new.email@example.com'
user.skip_reconfirmation!
user.save!

如果您想从应用程序中删除重新确认功能,并在更新电子邮件时立即进行更新而不发送通知,请转到config/devise.rb并更改以下值。
config.reconfirmable = true

为了

config.reconfirmable = false

请注意,如果在 devise.rb 文件中将 reconfirmable 选项设置为 true,则任何电子邮件更新都会保存在数据库的 unconfirmed_email 列中,直到您通过电子邮件进行确认。

0

当更新电邮时,请使用skip_reconfirmation!

skip_reconfirmation!

@user = User.find_by_email('bob@site.example')
@user.email = 'dead@site.example'
@user.skip_reconfirmation!
@user.save!

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