2012-05-03 169 views
0

我利用這個規律在我的模型:的Rails 3 - 路由和參數名稱

def to_param 
    "#{self.name.parameterize}" 
    end 

,在我的幫助:

def articles_menu 
    menu = '<ul>' 
    Article.all.each do |article| 
     menu += '<li>' 
     menu += link_to "#{article.name}", article 
     menu += '</li>' 
    end 
    menu += '</ul>' 
    return menu.html_safe 
    end 

,但是當我去到/articles/my-new-flat,我會得到錯誤

ActiveRecord::RecordNotFound in ArticlesController#show 

Couldn't find Article with id=my-new-flat 

失蹤我還有其他東西還是在我的應用程序中的任何問題?我雖然對名稱的參數化只需要建立模型規則...

回答

0

使用FriendlyId寶石它擁有所有你所需要的,這裏是鏈接https://github.com/norman/friendly_id/blob/master/README.md

問題與您的代碼是軌道在hub下試圖通過「id」屬性查詢你的模型,它不查詢「name」屬性。 FriendlyId寶石補丁爲你想要的模型

+0

還有一種方法可以不使用** FriendlyId **。我知道這個寶石,但我不想幹涉數據庫結構...無論如何,你必須改變軌道如何工作,什麼是':ID'路線參數的方式。 – user984621

+0

。您可以查看FriendlyId源代碼。有2個文件要檢查https://github.com/norman/friendly_id/blob/master/lib/friendly_id/finder_methods.rb和https://github.com/norman/friendly_id/blob/master/lib/ friendly_id/finder_methods.rb。第二個是你正在尋找的實際擴展,它應該擴展ActiveRecord :: Base –

+0

還有一件事,該方法的原始實現也應該炒作,所以要注意它響應模型的實際ID。你只需要用'Article.find_on(1234)'和'Article.find_one(「article-name-or-title」)來測試它' –