尽管“while”修饰符为false,但Ruby表达似乎正在执行

时间:2012-05-31 19:53:21

标签: ruby-on-rails-3

我的用户模型中有以下代码:

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,我对如何实现这一点感到困惑。我错过了什么吗?

1 个答案:

答案 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