2016-11-09 140 views
4

在我的Rails應用程序中,我有存儲在數據庫中的頁面。動態頁面的Rails嵌套路由

因此,例如:

id: 1 
name: 'About' 
slug: 'about' 
parent_id: null 

id: 2 
name: 'Team' 
slug: 'team' 
parent_id: 1 

id: 3 
name: 'Cameron' 
slug: 'cameron' 
parent_id: 2 

嵌塞用於通過路由訪問他們像這樣:

/about 
/team 
/cameron 

match '/:slug' => 'pages#show', :via => :get, :as => :page 

這樣我就可以在訪問這些頁面我想要做的是使用parent_id,以便路由變成:

/about/team/cameron 

這可以通過單獨使用路由來實現嗎?或者我還需要做其他的事情?

回答

0

請在Friendly gem處尋求幫助,它可以簡化許多使用slu routing的路由。

備選方案來定義像

路線據我知道有與動態paramlinks路線沒有什麼好辦法,你可以創建一個名爲路線捕捉美麗的嵌套頁面路徑:

get '/p/*id', :to => 'pages#show', :as => :nested_pages 

而且,確保你更新頁面對象的slu to以嵌套url,例如:追加父頁面的slu to。例如:

page1.slug = '/about' 
page2.slug = '/about/team' # team is a child of about 
page3.slug = '/about/team/cameron' # cameron is a child of team 

,這樣就可以像這樣

get '/p/*id', :to => 'pages#show', :via => :get, :as => :nested_pages or pages 

所以可以做到了,使這項工作,你也許可以改變generate_slug方法在你的頁面模型類:

def generate_slug 
    name_as_slug = name.parameterize 
    if parent.present? 
    self.slug = [parent.slug, (slug.blank? ? name_as_slug : slug.split('/').last)].join('/') 
    else 
    self.slug = name_as_slug if slug.blank? 
    end 
end 
+0

其實我真的很喜歡這個來產生永久鏈接。我已經修改你的代碼是這樣的:'def generate_permalink name_as_permalink = slug.parameterize if parent_id.present? parent = Page.where(:id => parent_id).first self.permalink = [parent.permalink,(permalink.blank??name_as_permalink:permalink.split('/')。last)]。join('/ ') else self.permalink = name_as_permalink if permalink.blank? 結束 結束# – Cameron

+0

感謝卡梅倫它也可以工作很好 –

1

您無法通過嵌套路線實現此目的,但您可以使用route globbing and wildcards。讓我來概括它可能需要去實現它,你的步驟:

  1. 添加一個通配符路線像get '*path', to: 'pages#show'到你的路由文件的末尾,否則它會匹配所有其它GET請求。
  2. pages#show操作中獲取params['path']的記錄。

從最後一段開始嘗試找到它。如果你沒有找到它,頁面不存在。如果你得到最後一個slu segment部分的結果,請檢查它們的para象,如果它們與下一個slu segment部分相匹配等等。

如果這將是一棵巨大的樹,這個解決方案可能會造成性能問題。然後你可以實現一些存儲路徑的東西或者使用像PostgreSQL ltree這樣的解決方案。

+0

「如果你得到最後一個slu segment部分的結果,檢查它們的para象,如果它們與下一個slu segment部分相匹配,等等。」你能舉一個我可以如何做的例子嗎? – Cameron

+0

也許類似https://gist.github.com/openscript/7199e9b5515c45a4b7bc05d23dd7e9aa將工作。這是一種僞紅寶石代碼。你需要適應一些事情。 – Robin

+0

我們不只是對slu last的最後一頁感興趣嗎?爲什麼你需要循環瀏覽其餘的頁面? – Cameron