ruby-on-rails – 用于动态页面的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

slug用于通过路由访问它们,如下所示:

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

所以我可以访问这些页面:

/about
/team
/cameron

我想要做的是使用parent_id,以便路由成为:

/about/team/cameron

这可以单独使用路由来实现吗?或者我还需要做其他事情吗?

最佳答案 在
Friendly gem处获得帮助,它可以简化使用slug的路由.

定义路线的替代选项

据我所知,使用动态paramlinks的路由没有好办法,你可以创建一个命名路由来捕获漂亮的嵌套页面路径:

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

此外,请确保更新页面对象的slug以具有嵌套的URL,即:将父页面的slug附加到它.例如:

 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

因此,为了使这项工作,您可以更改Page模型类中的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
点赞