我想在我的users表中添加一个新列,并使用随机令牌填充它。我有这个工作,但我很好奇为什么我尝试的第一种方法不起作用。
以下是我的迁移的工作版本:
class AddTokenToUser < ActiveRecord::Migration
def up
add_column :users, :secure_token, :string
User.reset_column_information
User.all.each do |user|
user.secure_token = SecureRandom.urlsafe_base64(16)
user.save!
end
end
def down
remove_column :users, :secure_token
end
end
但是,因为我也希望代码在User模型上生成这个令牌,因为我想和每个新用户一起创建一个新令牌,我想我可以添加代码作为User对象的方法:
class User < ActiveRecord::Base
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_many :snaps
def generate_new_secure_token
@secure_token = SecureRandom.urlsafe_base64(16)
end
end
...然后从迁移中调用它,以避免重复自己:
class AddTokenToUser < ActiveRecord::Migration
def up
add_column :users, :secure_token, :string
User.reset_column_information
User.all.each do |user|
# user.secure_token = SecureRandom.urlsafe_base64(16)
user.generate_new_secure_token
user.save!
end
end
def down
remove_column :users, :secure_token
end
end
但是,使用这种方法,我没有得到任何错误,但我的secure_token列值在数据库中最终都为NULL,而不是在其中包含一个令牌。
我是Rails和Ruby的新手,所以我觉得我错过了一些明显的东西,但我看不出它是什么。为什么我的方法不起作用,并且有一种将令牌生成例程移动到User类的好方法,所以我不需要在两个不同的位置使用它?
答案 0 :(得分:3)
将您的方法更改为此
def generate_new_secure_token
self.secure_token = SecureRandom.urlsafe_base64(16)
end
@secure_token
是一个实例变量。设置不会更改用户对象上的属性secure_token