2016-01-21 66 views
1

我有一個方法可以創建一個令牌。這工作,現在我想也確保令牌的唯一性。因此我加了while self.class.exists?(api_digest: api_digest)(見下文)。不過,現在測試的種種失敗與錯誤:如何檢查生成的令牌不存在?

ArgumentError: wrong number of arguments (0 for 2)

def remember_api(type, user)這在會話幫手。任何想法我做錯了什麼?


用戶模式:

def remember_api 
    self.api_token = User.new_token # Creates new api_token. 
    update_attributes(api_digest: User.digest(api_token), api_sent_at: Time.zone.now) 
end while self.class.exists?(api_digest: api_digest) 

def User.new_token 
    SecureRandom.urlsafe_base64 
end 

def User.digest(string) 
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost 
    BCrypt::Password.create(string, cost: cost) 
end 

會議助手:

def remember_api(type, user) 
    if type == "user" 
    user.remember_api 
    end 
end 

更新:所以,我想下面的方法。但是,這似乎並不奏效,因爲它陷入了無限循環。

def remember_api 
    begin 
    self.api_token = User.new_token 
    update_attributes(api_digest: User.digest(api_token), api_sent_at: Time.zone.now) 
    end while self.class.exists?(api_digest: api_digest) 
end 

UPDATE2:我已經得到了唯一性模型驗證的api_digest和嘗試以下操作:

def remember_api 
    begin 
    self.api_token = User.new_token 
    api_digest = User.digest(api_token) 
    debugger 
    end until update_attributes(api_digest: api_digest, api_sent_at: Time.zone.now) 
end 

這不順心,再創建一個無限循環。這證明,一旦我將update_attributes移動到end之後,調試器顯示api_digestapi_tokennil。並且self返回:User(id: integer, email: string, username: string, fullname: string, ...。如果我將update_attributes放置在begin...end(下面的調試器)內,它們不是nilself返回:<Userid: 1001, email: "[email protected]", username: "mystring1", ...

+1

我不認爲'高清...到底while'做什麼,你認爲它。如果你在'while'之後的條件評估爲'false',那麼這個方法就不會被定義,如果它評估爲'true',那麼這個方法會被一遍又一遍地重複定義(直到它被評估爲'false')。 –

+0

[Jordan](http://stackoverflow.com/users/179125/jordan)表示 - 在User#remember_api方法內部創建一個單獨的'begin' /'end而self.class.exists?...' 。 – mikej

+0

謝謝!我已經添加了我相信你建議作爲OP的更新。 – Marty

回答

1

第二個api_digest應該是self.api_digest。這是因爲它正在尋找所謂api_digest一個局部變量,但是你對這個模型

像這意味着一個屬性:

def remember_api 
    begin 
    self.api_token = User.new_token 
    update_attributes(api_digest: User.digest(api_token), api_sent_at: Time.zone.now) 
    end while self.class.exists?(api_digest: self.api_digest) 
end 

更新

當你調用update_attributes,它將返回如果它更新並通過驗證,則爲true。然後它會繼續檢查它是否存在,它確實是因爲你剛剛更新它,所以它會再次循環並導致無限循環

如果update_attributes返回false,表示它存在並滿足while語句和循環。這是它所做的唯一一次。

begin 
    self.api_token = User.new_token 
    self.api_digest = User.digest(api_token) 
end while self.class.exists?(api_digest: self.api_digest) 
self.api_sent_at = Time.zone.now 
self.save! 

文件:update

+0

謝謝你一直在想。不幸的是,將其更改爲'self.api_digest'沒有任何區別。 – Marty

+0

啊,我想我知道爲什麼。在檢查之前調用'update_attributes',所以它總是存在 – Vincent

+0

如果它不是唯一的,那麼它就不會評估爲「真」,因爲那麼模型驗證將不允許它保存。但是,我不明白的是,如果「存在?」評估爲「真」,則該方法不會繼續;相反,它會重新開始創建一個無限循環。 – Marty