我的用户模型中有以下代码:
before_save :create_remember_token
private
def create_remember_token
generate_token(:remember_token)
end
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while User.exists?(column => self[column])
end
这很好用,但问题是我期待它失败。我的印象是:while User.exists?(column=>self[column])
行将返回 false ,因为记录尚未保存到数据库,因此,不会设置remember_token。
但是新创建的用户确实设置了remember_token,我对如何实现这一点感到困惑。我错过了什么吗?
答案 0 :(得分:1)
如果其他人想知道,begin end
表达式中的代码将在评估条件之前运行一次,除非您提供了救援条款:
# x is not incremented as condition is evaluated first
1.9.3p194 :033 > x=0
=> 0
1.9.3p194 :034 > x+=1 while x>14
=> nil
1.9.3p194 :035 > x
=> 0
# x is incremented because code inside begin end is evaluated once before the condition
1.9.3p194 :036 > begin
1.9.3p194 :037 > x+=1
1.9.3p194 :038?> end while x>14
=> nil
1.9.3p194 :039 > x
=> 1