2017-02-27 78 views
0

我正在構建一個讓用戶管理組織和用戶的Rails 5團隊管理應用程序。我希望能夠在路徑中使用:id(例如:/organizations/43),並使用字母數字代替(例如:/organizations/H6Y47Nr7)。類似於Trello如何做到這一點(即:https://trello.com/b/M9X71pE6/board-name)。有沒有一個簡單的方法來做到這一點?在路線中使用字母數字slu instead代替ids - Rails

我已經看到了FriendlyId寶石,它可以處理路徑中的猛擊,但是首先產生slu what的最好方法是什麼?

理想情況下,對於最多爆炸降壓 slu would將包括AZ,az和0-9(據我所知,這是Base58?),並且爲了不會將URL過度吹出,8最多的字符。如果我的計算結果是正確的,那麼這將產生218萬億個組合,這應該足夠多。

我在正確的軌道上嗎?任何幫助將非常感激。

感謝

+0

您可以檢查[hashids(https://github.com/peterhellberg/hashids。 rb)支持自定義數量的字符和字符以包含在slu ge中的寶石。我最近做了一個rails [插件](https://github.com/sajan45/hashids_activerecord),但我還沒有在生產中使用過它們。 – Sajan

+1

看看我的老答案在這裏http://stackoverflow.com/a/16096646/1297435 –

回答

1

要創建蛞蝓,最簡單的方法是使用SecureRandom。您可以

before_create :generate_slug 

private 

def generate_slug 
    begin 
    self.slug = SecureRandom.urlsafe_base64(8) 
    end while Organization.exists?(slug: slug) 
end 

一個小小的警告這裏對於添加像下面在你的模型,你想要的東西是,塞有時會包含下劃線或破折號但應該罰款。

irb(main):014:0> SecureRandom.urlsafe_base64(8) 
=> "HlHHV_6rN3k" 
irb(main):015:0> SecureRandom.urlsafe_base64(8) 
=> "naRqT-NmYDU" 
irb(main):016:0> SecureRandom.urlsafe_base64(8) 
=> "9h04l4jEEsM" 
+0

感謝您的回覆。難道我不能僅僅使用'SecureRandom.base58(8)'而不是?它返回類似'KBz4i9ux'的東西。 – slehmann36

+0

另外,處理碰撞怎麼樣?或者'SecureRandom'照顧它?再次感謝! – slehmann36

+0

不熟悉'base58'。我之所以使用'urlsafe_base64'是因爲你需要一個url安全的字符串。至於碰撞,發生比賽情況的可能性很小,但我不擔心 – jvnill

0

如果你走這條路,我會創建一個表中保存您生成蛞蝓,當你刪除一個組織不要刪除它們連。當你創建一個新組織查詢這個模型時,確保沒有重複的slu gs。還要在組織表的slug列中添加一個唯一的索引。

你不應該放棄與整數id列,以便在展會方法,你需要做的:

org = Organization.where(slug: params[:id]).first