我有一個方法可以創建一個令牌。這工作,現在我想也確保令牌的唯一性。因此我加了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_digest
和api_token
是nil
。並且self
返回:User(id: integer, email: string, username: string, fullname: string, ...
。如果我將update_attributes
放置在begin...end
(下面的調試器)內,它們不是nil
而self
返回:<Userid: 1001, email: "[email protected]", username: "mystring1", ...
。
我不認爲'高清...到底while'做什麼,你認爲它。如果你在'while'之後的條件評估爲'false',那麼這個方法就不會被定義,如果它評估爲'true',那麼這個方法會被一遍又一遍地重複定義(直到它被評估爲'false')。 –
[Jordan](http://stackoverflow.com/users/179125/jordan)表示 - 在User#remember_api方法內部創建一個單獨的'begin' /'end而self.class.exists?...' 。 – mikej
謝謝!我已經添加了我相信你建議作爲OP的更新。 – Marty