2012-08-02 44 views
0

當前我的網址顯示爲www.website.com/entries/1,我想讓它們顯示爲www.website.com/title-of-entry。我一直在搞routes,並且已經能夠獲得entry標題顯示在URL中,但是Rails在沒有提供ID的情況下找不到entry。如果我將ID與參數一起發送,則URL顯示爲www.website.com/title-of-entry?=1。無論如何,我可以通過該ID,而不會出現在URL中作爲參數?謝謝!使URL成爲帖子標題

回答

1

像大多數事情一樣,這裏有一個寶石。

FriendlyID

安裝非常簡單,您只需幾分鐘即可完成安裝。給它一個旋轉。

1

通常你會想將這部分保存在數據庫title-of-entry(請致電slug或其他東西)。您的模型可以是這個樣子:

class Entry < ActiveRecord::Base 

    before_validation :set_slug 

    def set_slug 
    self.slug = self.title.parameterize 
    end 

    def to_param 
    self.slug 
    end 

end 

現在你生成路線是這樣的:/entries/title-of-entry

來找到你必須改變你的控制器相應的條目:

# instad of this 
@entry = Entry.find(params[:id] 

# use this 
@entry = Entry.find_by_slug(params[:id]) 

更新

需要記住的幾件事:

  1. 您必須確保slug是唯一的,否則Entry.find_by_slug(params[:id])將始終返回與它遇到的slu first的第一個條目。

  2. Entry.find_by_slug(params[:id])不會引起ActiveRecord::RecordNotFound異常,而只是返回nil。考慮使用Entry.find_by_slug!(params[:id])

  3. 如果你真的希望你的路線看起來像這樣/title-of-entry,你可能會在稍後遇到問題。如果條目slug與另一個控制器的名稱相同,路由器可能會得到意想不到的結果。

+0

非常感謝@Wukerplank的詳細建議,我昨晚在這個地方搞了個鬼混,無法讓事情奏效。我總是會被引導到同一個「入口」,而不管我傳入的是哪個'id'。我確信有更多的時間和黑客入侵,我可以按照您的建議讓事情發揮作用,但爲了不輕鬆處理slu//題目問題,我會去與寶石。你絕對應該得到這個讚賞,但再次感謝! – 2012-08-02 14:12:57