在我们的应用程序中,我们希望将用户从旧表迁移到由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
等其他可能性,但都失败了。
答案 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!
。
但这只会在你的迁移任务中发挥作用。下次用户进行更新时(例如,他想更改他的名字),将再次发送确认邮件。
如果设计尝试发送确认电子邮件,那是因为:
:confirmable
和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