2010-01-16 287 views
4

我目前正在開發使用Ruby on Rails的一個博客系統,並希望用戶來定義自己的「固定鏈接」爲靜態頁面或博客文章,意思是:固定鏈接使用Ruby on Rails的(動態路由)

用戶應能夠設置頁面名稱,例如。 「測試文章」(應通過/ posts/test-article提供) - 我如何在rails應用程序和路由文件中實現這一點?

回答

3

修改在模型中to_param方法確實需要/方便,像其他人已經說了:

def to_param 
    pagename.parameterize 
end 

但爲了找到你還需要改變控制器的職位,因爲默認Post.find方法搜索ID而不是頁面名稱。對於展會行動,你需要這樣的事情:

def show 
    @post = Post.where(:pagename => params[:id]).first 
end 

其他行動方法也一樣。

您的路由規則可以保持與具有ID號的常規路由相同。

0

你應該在頁面或者帖子的對象中擁有seolink或者permalink屬性。然後,您只需使用to_param方法來發送您的帖子或頁面模型,以返回該屬性。

to_param方法用於*_path方法,當您將它們傳遞給對象時。

所以,如果您的文章標題有「富巴」和seolink「巴茲 - QUUX」,你在模型中定義一個to_param方法是這樣的:

def to_param 
    seolink 
end 

然後當你這樣做post_path(@post)你會得到/posts/baz-quux或您在config/routes.rb文件中配置的任何其他相關網址(我的示例適用於資源豐富的網址)。在您的控制器的show操作中,您只需要find_by_seolink而不是find[_by_id]

2

我個人更喜歡做這種方式:

放入後你的模型如下(在關閉「結束」標籤前的底部貼吧)

def to_param 
    permalink 
end 

def permalink 
    "#{id}-#{title.parameterize}" 
end 

就是這樣。您不需要更改任何find_by方法。這爲您提供了「123-title-of-post」形式的URL。

+0

這是糟糕的SEO實踐,因爲谷歌認爲URL中的第一個詞比後者更重要 – Houen 2011-06-30 08:14:27

+0

@Houen您是否建議刪除ID?當然,一些額外的數字不會有太大的區別/你有任何鏈接,使這個更清晰的東西?這是所有搜索引擎相同(雅虎,冰等)感謝 – stephenmurdoch 2011-06-30 11:40:55

+0

它的acutally沒有太多關於數字,因爲它是關於字數,並且短劃線被視爲由谷歌分詞。第一個單詞帶有最重的SEO權重。對不起,沒有提到這一點,這是發言者在Google IO 2010上告訴我們的 – Houen 2011-06-30 12:22:57

1

這個#63#117集的railscasts可能會幫助你。還要檢查那裏的資源。

2

您可以使用friendly_id寶石。沒有需要特殊的控制器更改。簡單地添加一個屬性,例如slu to給你的模型..更多細節請參閱gem的github回購。