Ruby on rails 用于动态页面的Rails嵌套路由
在我的Rails应用程序中,我有存储在数据库中的页面 例如:Ruby on rails 用于动态页面的Rails嵌套路由,ruby-on-rails,routing,Ruby On Rails,Routing,在我的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 page1.slug = '/about' page2.slug = '/about/team' # team is a child o
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
page1.slug = '/about'
page2.slug = '/about/team' # team is a child of about
page3.slug = '/about/team/cameron' # cameron is a child of team
slug用于通过路由访问它们,如下所示:
match '/:slug' => 'pages#show', :via => :get, :as => :page
因此,我可以在以下位置访问这些页面:
/about
/team
/cameron
我想做的是使用parent\u id
,使路由变成:
/about/team/cameron
这可以通过单独使用路由来实现吗?或者我还需要做其他事情吗?嵌套路由无法实现这一点,但可以使用。让我为您概括一下实现这一目标可能需要采取的步骤:
get'*path')添加到路由文件末尾的“pages#show”
,否则它将匹配所有其他get请求页面#show
操作中获取参数['path']
的记录从最后一段开始,试着找到它。如果找不到,则该页面不存在。如果你得到最后一个段塞的结果,检查他们的PARANT,如果他们与下一个段塞匹配,依此类推 如果是一棵大树,这个解决方案可能会产生性能问题。然后,您可以实现将路径存储在某处的东西,或者使用类似PostgreSQL的解决方案 请接受帮助,它大大简化了使用slug的路由 定义路线的可选选项,如 据我所知,没有使用动态参数链接创建路由的好方法,您可以创建一个命名路由来捕获漂亮的嵌套页面路径:
get '/p/*id', :to => 'pages#show', :as => :nested_pages
另外,请确保更新页面对象的slug,使其具有嵌套URL,即:将父页面的slug追加到它。例如:
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
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
“如果你得到最后一个段塞的结果,检查他们的PARANT,如果他们与下一个段塞相匹配,等等。”你能举个例子说明我是如何做到这一点的吗?也许类似的方法会奏效。这是一种伪ruby代码。你需要修改一些东西。我们不仅仅对slug的最后一页感兴趣吗?为什么需要循环浏览其余页面?需要什么
current=current.parent.where(slug:s)
?因为我们只想得到最后一页?这本身似乎是可行的:@page=page.find_by(slug:params[:slug.).split(“/”).reverse.first)
,所以我想知道你对其他代码的原因是什么。谢谢你的帮助。我真的很喜欢这个生成永久链接的方法。我修改了您的代码如下: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)]。如果permalink.blank,则加入('/')else self.permalink=name_permalink?结束