這就是我正在使用的。令牌不必一定要猜測,它更像是一個簡短的url標(biāo)識符,而不是其他任何東西,我想使其簡短。我遵循了一些我在網(wǎng)上找到的示例,如果發(fā)生碰撞,我認(rèn)為下面的代碼將重新創(chuàng)建令牌,但是我不確定。不過,我很好奇看到更好的建議,因?yàn)檫@樣的感覺有些粗糙。def self.create_token random_number = SecureRandom.hex(3) "1X#{random_number}" while Tracker.find_by_token("1X#{random_number}") != nil random_number = SecureRandom.hex(3) "1X#{random_number}" end "1X#{random_number}" end我的令牌數(shù)據(jù)庫列是唯一索引,我也在validates_uniqueness_of :token模型上使用它,但是因?yàn)檫@些是根據(jù)用戶在應(yīng)用程序中的操作自動創(chuàng)建的(它們實(shí)際上是下訂單并購買令牌)而批量創(chuàng)建,所以讓應(yīng)用拋出錯誤是不可行的。我想,我也可以減少沖突的機(jī)會,在末尾附加另一個字符串,這些字符串是基于時(shí)間生成的,或者類似的東西,但是我不希望令牌太長。
3 回答

白衣染霜花
TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個贊
這可能是一個較晚的響應(yīng),但是為了避免使用循環(huán),您還可以遞歸調(diào)用該方法。它看起來和感覺對我來說都比較干凈。
class ModelName < ActiveRecord::Base
before_create :generate_token
protected
def generate_token
self.token = SecureRandom.urlsafe_base64
generate_token if ModelName.exists?(token: self.token)
end
end
- 3 回答
- 0 關(guān)注
- 748 瀏覽
添加回答
舉報(bào)
0/150
提交
取消