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

これはうまく機能しますが、問題は、失敗することを期待していたことです。行: はfalsewhile User.exists?(column=>self[column])を返すという印象を受けました。これは、レコードがまだデータベースに保存されていないため、remember_token が設定されないためです。

しかし、新しく作成されたユーザーにはremember_tokenが設定されており、これがどのように可能になるかについて少し混乱しています. 何か不足していますか?

4

1 に答える 1

1

他の誰かが疑問に思っているbegin end場合に備えて、rescue 句を指定しない限り、条件が評価される前に式内のコードが 1 回実行されます。

# 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 に答える