2014-11-04 78 views
2

我有一个单一的模式:轨道 - 如何使嵌套的路线与祖先

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宝石创建的页面和子页面树,即页面可以有多个子页面和子页面也可以有多个子页面,以此类推至无穷大。

但我的问题是,我不能做的东西是/page-1/page-1-2/page-1-2-1。所有子页面的URL是:/page-1-2/page-1-3-1

我的routes.rb:

Rails.application.routes.draw do 
    get '/pages' => 'pages#index' 

    resources :pages, path: "", path_names: { new: 'add' } 

    root 'pages#index' 
end 

如何使嵌套的网址是什么?

谢谢!

回答

3

据我知道有捕捉动态的永久链接嵌套的树状结构的路线不整洁的方式,你可以创建一个名为路线捕捉美丽的嵌套页面路径:

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 

因此,为了使这项工作,你也许可以改变generate_slug方法在Page模型类:

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 
+1

它的作品,THX!但是当我想编辑一些子页面时,我发现错误“ActiveRecord :: RecordNotFound'和'Parameters:{”slug“=>”page-1/page-1-1/page-1-1-1/page-1 1-1-1 /编辑“}'。我如何解决这个问题? – jazzis18 2014-11-04 12:01:21

+0

你需要使用'Page.find_by_slug(params ['slug'])'。另外,如果有帮助,请不要忘记[接受答案](https://stackoverflow.com/tour)。 – Surya 2014-11-04 12:04:15

+0

对不起)是的,我用它'find_by_slug',但我都一样抓住这个错误。 – jazzis18 2014-11-04 12:38:14