2014-11-04 2 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 

Как сделать вложенную URL?

Спасибо!

ответ

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

Это работает, ТНХ! Но когда я хочу редактировать что-то подстраницу, я поймал ошибку 'ActiveRecord :: RecordNotFound' и' Параметры: {"slug" => "page-1/page-1-1/page-1-1-1/page-1 -1-1-1/редактировать "}'. Как я могу решить эту проблему? – jazzis18

+0

Вам нужно использовать 'Page.find_by_slug (params ['slug'])'. Кроме того, не забудьте [принять ответ] (https://stackoverflow.com/tour), если это поможет. – Surya

+0

Извините) Да, я использовал его 'find_by_slug', но я все равно поймаю эту ошибку. – jazzis18

Смежные вопросы