如何在RoR中搜索记录?

问题描述:

我知道我可以使用查询语言来查找我想要的记录。我正在做一个登录页面,我想查找与用户名和密码相匹配的记录,但我不想循环所有元素来找出我想要的用户(< @ users.each do | user | %>),wt应该在RoR中做,除了键入SQL。如何在RoR中搜索记录?

也许是:

User.first(:conditions => {:login => 'ted', :password => 'secret'}) 
# returns nil for no match and first match for a good record 
# make sure there is a unique index on login 

为了验证我会强烈建议authlogicrailscast

+0

对于像我这样的初学者来说,似乎很难使用authlogic ......我发现RoR有很多简短的事情来做,但是我对它没有足够的理解...... thx很多。 – DNB5brims 2009-12-27 07:56:22

您可以使用动态查找器通过user_name和密码来查找用户:

@user = User.find_by_user_name_and_password('scott', 'tiger') 

而其他Sam和Chandra提供的答案在技术上是正确的,两种解决方案都意味着密码以纯文本格式存储 - 这就是一个非常想不好主意。如果有人不应该访问您的数据库,他们将拥有一组完整的用户名(以及可能的电子邮件地址)以及所有的密码。

相反,请考虑使用算法来确保您的密码在数据库中已加密,如bcrypt。您需要使用bcrypt-rub宝石。

您还应该考虑完全不考虑查询中的密码。这是一个很好的做法,因为它提供了额外的安全级别; SQL注入变得更难执行。如果用户有唯一的用户名,只是获取用户名应返回相同的对象,之后就可以检查密码是否正确:

@user = User.find_by_username(params[:username]) 
if @user.password == params[:password] 
    # do something 
else 
    # do something else 
end 

理想情况下,你应该都使用bcrypt和查询离开了密码。如何做到这一点在GitHub上的bcrypt-ruby自述文件(我提供的链接)中有描述。