En iyi token eşsiz Raylar oluşturmak için?
Kullanıyorum işte. Belirteç mutlaka tahmin haber olmak zorunda değil, başka bir şey daha kısa bir url tanımlayıcısı gibi, ve kısa tutmak istiyorum. Online ve bir çarpışma durumunda buldum bazı örnekler takip ediyorumSanırımaşağıdaki kod belirteci yeniden olacak, ama tam olarak emin değilim. Bu kenarlarda biraz kaba hissediyor kadar iyi bir öneri, ama bakın, merak ediyorum.
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
Benim veritabanı sütun simgesi benzersiz bir dizin ve ben de kullanma validates_uniqueness_of :token
model, ama çünkü bu oluşturulan gruplar otomatik olarak dayalı bir kullanıcının eylemlerin uygulama (onlar sipariş ve satın belirteçleri, aslında, bulunamadığı için bu uygulama atmak bir hata.
Ben de, sanırım, azaltmak için şans çarpışmalar, ekleme başka bir dize sonunda, bir şeyler üretilen dayandığı zaman ya da bir şey gibi, ama istemiyorum token almak çok uzun.
CEVAP
-- Güncelleme --
Gibi9 Ocak 2015.çözüm aşağıda açıklanan ActiveRecord's secure token implementation lehine önerilmiyor.
-- -- Kaldırılmış
Sadece ileride başvurmak için güvenli rastgele token oluşturma ve sağlama modeli Ruby 1.9 ve ActiveRecord kullanıldığında) teklik:
class ModelName < ActiveRecord::Base
before_create :generate_token
protected
def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless ModelName.exists?(token: random_token)
end
end
end
Düzenleme:
@kain önceki uygulama gelecekte kaldırılmış olabilir çünkü ben kabul ettim, bu cevap loop do...break unless...end
begin...end..while
değiştirmek için önerdi.
Edit 2:
Ve endişeleri Rails 4 ile, endişe bu hareket tavsiye ederim.
# app/models/model_name.rb
class ModelName < ActiveRecord::Base
include Tokenable
end
# app/models/concerns/tokenable.rb
module Tokenable
extend ActiveSupport::Concern
included do
before_create :generate_token
end
protected
def generate_token
self.token = loop do
random_token = SecureRandom.urlsafe_base64(nil, false)
break random_token unless self.class.exists?(token: random_token)
end
end
end
Nasıl özgünlük Raylar, belirli eylemle...
Benim en Raylar için özel yapılandırma...
HTML olarak bir dize oluşturmak için n...
Nasıl denetleyicisi oluşturmak için ra...
Nasıl oluşturmak ve bir modül Ruby kul...