2016-11-09 125 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