【问题标题】:rails - how to make nested route with ancestryrails - 如何使用祖先制作嵌套路线
【发布时间】:2014-12-31 02:58:11
【问题描述】:

我只有一个模型:

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

如何制作嵌套网址?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby nested-routes ancestry


    【解决方案1】:

    据我所知,使用动态永久链接捕获嵌套树状结构的路由没有巧妙的方法,您可以创建一个命名路由来捕获漂亮的嵌套页面路径:

    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
    

    【讨论】:

    • 成功了,谢谢!但是当我想编辑一些子页面时,我发现了错误ActiveRecord::RecordNotFound 和Parameters: {"slug"=&gt;"page-1/page-1-1/page-1-1-1/page-1-1-1-1/edit"}。我该如何解决这个问题?
    • 您需要使用Page.find_by_slug(params['slug'])。另外,如果有帮助,别忘了accept answer。
    • Sorry) 是的,我用过 find_by_slug 但我都发现了这个错误。
    • 好的,我解决了这个问题。现在我在更改记录后无法更新 slug。蛞蝓仍然是这样的:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    相关资源
    最近更新 更多