【问题标题】:Ruby on Rails: How to prevent confirmation emails when migrating users in database?Ruby on Rails:在数据库中迁移用户时如何防止确认电子邮件?
【发布时间】:2014-06-25 12:08:47
【问题描述】:

在我们的应用程序中,我们希望将用户从旧表迁移到由 devise gem 管理的新表。我用属性old_id 链接了这两个表,所以我总是可以返回到以前的用户信息并从那里获取其他数据。这是迁移脚本(一旦创建表):

class PopulateV3idInUsersTable < ActiveRecord::Migration

  def up
    User.all.each do |u|
      old_u = OldUser.find_by( email: u.email )
      unless old_u.nil?
        u.old_id = old_u.id
        u.skip_confirmation!
        u.save
      end
    end
  end

end

数据库已正确更新。问题是,每次我们用他的旧 id 更新用户时,脚本都会向用户发送一封确认邮件,这真的不好......

在之前的代码中,我添加了u.skip_confirmation!,但还是不行。我还尝试了其他可能性,例如u.confirm!u.confirmation_token = nil ; u.confirmed_at = Time.now,但都失败了。

你有什么想法吗?谢谢。

【问题讨论】:

标签: ruby-on-rails devise actionmailer


【解决方案1】:

试试这个:

class PopulateV3idInUsersTable < ActiveRecord::Migration
  def up
    User.all.each do |u|
      old_u = OldUser.find_by( email: u.email )
      unless old_u.nil?
        u.old_id = old_u.id
        u.skip_confirmation_notification!
        u.confirmation_sent_at = nil
        u.save
      end
    end
  end

【讨论】:

    【解决方案2】:

    正如 Luke 所说,您想使用 #skip_confirmation_notification! 而不是 #skip_confirmation!

    但这只会在您的迁移任务中发挥作用。下次用户发生更新时(例如,他想更改他的名字),将再次发送确认邮件。

    如果设计尝试发送确认电子邮件,那是因为:

    1. 您的用户模型包括:confirmable
    2. 您的用户没有设置confirmed_at 属性

    不使用可确认

    如果您根本不想确认,请从设计选项中删除 :confirmable

    class User < ActiveRecord::Base
      # whatever modules you want to use, except :confirmable
      devise :database_authenticatable, :registrable, :recoverable
    end
    

    使用可确认

    如果您想使用可确认但解决旧用户问题,请在迁移中设置他们的#confirmed_at 属性:

    class PopulateV3idInUsersTable < ActiveRecord::Migration
    
      def up
        User.all.each do |u|
          old_u = OldUser.find_by( email: u.email )
    
          u.confirmed_at = Time.now    
          u.old_id = old_u.id unless old_u.nil?
          u.save
        end
      end
    
    end
    

    【讨论】:

    • 非常感谢@Olivier 的深入回答。我现在更了解发生了什么。奇怪的是,有时我使用u.confirm! 并且不发送电子邮件(尤其是在控制器中)就足够了,但在迁移中却不行!还是谢谢。
    • 嗯,#confirm! 就是 about setting #confirmed_at ;)
    • 很好的答案@OlivierElMekki。我认为你应该得到 +15 ;)
    • Np,答案就在那里,最重要的是:)
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 2013-04-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多