Ruby on Rails:如何在数据库中迁移用户时阻止确认电子邮件?

时间:2014-06-25 12:08:47

标签: ruby-on-rails devise actionmailer

在我们的应用程序中,我们希望将用户从旧表迁移到由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等其他可能性,但都失败了。

你知道吗?感谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

正如卢克所说,你想使用#skip_confirmation_notification!而不是#skip_confirmation!

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

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

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

    如果您根本不想要确认,请从设计选项中删除: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