2013-09-23 62 views
0

我在我的用户表中创建了一个新的列(标记),并且我想要为每个现有用户对此列生成一个值。我补充说明的是:为每个用户添加一个新创建的列

class User < ActiveRecord::Base 
    before_save :generate_token 

    private 
    def generate_token 
     self.token = SecureRandom.urlsafe_base64(true, false) 
    end 

end 

然后我试着做:

rails console 
> User.find_each(&:save) 

但新柱犹无为每个用户。

当我尝试保存只有一个用户:

user = User.first 
user.save! 

它给了我一个错误:

ActiveRecord::RecordInvalid: Validation failed: Password is too short (minimum is 6 characters) 

这是从用户模式我的验证:

VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i 
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
has_secure_password 
validates :password, length: { minimum: 6 } 

我怎么可以解决这个?

+0

你可以发布这个模型的验证吗? –

+0

密码是虚拟属性,不存在 – medBo

+0

@DougR更新我的问题 – medBo

回答

0

看起来像你正在使用before_create回调。尝试使用before_save

编辑:

你需要跳过验证,以生成现有用户的令牌。在Rails控制台中:

User.find_each do |user| 
    user.save!(validate: false) 
end 
+0

也使用它,但没有结果 – medBo

+0

您是否在更改回调后重新加载了您的导轨控制台? –

+0

是的,它似乎有一个验证问题,我更新我的问题 – medBo

0

它看起来不像是在任何地方设置密码属性,这就是验证失败的原因。

+0

正确。但是,在这种情况下,OP不想设置密码,因为他正在批量更新其现有用户上的令牌字段。他只需跳过验证即可执行批量更新。 –

相关问题