我有一个单一的模型:
class Page < ActiveRecord::Base
has_ancestry
validates :slug, :name, uniqueness: true, presence: true
before_validation :generate_slug
def to_param
slug
end
def generate_slug
self.slug = Russian.translit(name).parameterize
end
end
我使用ancestry
-gem创建页面和子页面的树,即页面可以有多个子页面,子页面也可以有多个子页面,以此类推。
但我的问题是我不能做/page-1/page-1-2/page-1-2-1
的东西。所有子页面的URL都是:/page-1-2
或/page-1-3-1
。
我的路线.rb:
Rails.application.routes.draw do
get '/pages' => 'pages#index'
resources :pages, path: "", path_names: { new: 'add' }
root 'pages#index'
end
如何制作嵌套URL?
谢谢!
据我所知,没有一种巧妙的方法可以用动态永久链接捕获嵌套的树结构路由,你可以创建一个命名路由来捕获漂亮的嵌套页面路径:
get '/p/*id', :to => 'pages#show', :as => :nested_pages
此外,请确保更新页面对象的slug
,使其具有嵌套的URL,即:将父页面的slug
附加到其中。例如:
page1.slug = '/page-1'
page2.slug = '/page-1/page-2' # page2 is a child of page1
page3.slug = '/page-1/page-2/page-3' # page3 is a child of page2
因此,为了实现这一点,您可能可以更改Page
模型类中的generate_slug
方法:
def generate_slug
name_as_slug = Russian.translit(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