2012-04-28 36 views
0

我遵循rails教程并有一个工作用户系统,但有一件事让我很烦恼:保存用户时,即使在控制台中,也必须关闭验证因为如果没有保存密码和密码确认,它将不会保存,并设置为相同的内容。Rails教程 - 必须保存关闭用户的验证

这是一种痛苦,如果我向用户添加其他重要的验证,这似乎是潜在的危险。那么是否有处理这个问题的好方法?真的,我希望验证只适用于更新来自用户,而不是来自我自己的代码。

因此,用户模型具有这样的:

validates :password, length: { minimum: 6 } 
    has_secure_password # this does the hashing, comparisions, etc for us. 
    validates :password_confirmation, presence: true 

创建用户时,这个伟大的工程,而当用户编辑他/她的个人资料,因为它要求的密码再次进入。但是,对于其他编辑,这很烦人。例如:

user = User.find_by_name("bob") 
user.reputation = 200 
user.save(validate: false) # I really don't want to have to care about password validations here. 
+0

也许会让您的场景变得更加丰富多彩。您是否在创建用户之前创建了密码?或者每次保存新数据时系统都会检查密码?或者我还没有提到的其他一些情况? – 2012-04-28 11:33:29

+0

我编辑过这个来解释它更好。 – Jords 2012-04-28 11:50:46

回答

3

您可以拨打

@user.save(:validate => false) 
+0

谢谢,但这就是我的问题 - 这是一个真正的痛苦,似乎每次我想保存用户时都会有这种危险。 – Jords 2012-04-28 11:17:59

+1

默认情况下不检查验证是危险的,因为您可能会意外地破坏您的数据......并且如果您真的知道自己在做什么,您可以绕过验证 – 2012-04-28 11:22:52

+0

我同意@Adrian。将密码和确认都设置为相同的东西并不困难。 – EricM 2012-04-28 11:32:57

0

你可以尝试只验证上创建。这将使得密码(或其他变量)仅在注册时需要,但在编辑现有用户时不需要。

0

你为什么不只是为它创建不同的型号,用于记录密码更改的安全模型&,以及任何其他配置文件模型,并提供声誉,奖牌和内容。

在第一个模型创建新的功能,可以让你完全忘记了第二个,像

def reputation value 
    self.profile.reputation = value 
    self.profile.save 
end 
0

有点迟到了,但如果你要更新一个属性,你可以使用update_attribute方法这会跳过验证检查。在这种情况下,您可以拨打

user.update_attribute :reputation, 200