在我的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