Ruby on 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

在我的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 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?结束