0

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

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 集,我对这怎么可能有点困惑。我错过了什么吗?

4

1 回答 1

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 
于 2012-05-31T20:06:16.877 回答