2015-05-21 2 views
1

Я не хочу использовать соглашения о маршрутизации Rails, так как я хочу, чтобы мои URL-адреса выглядели определенным образом. Моя иерархия структуры модели динамична.Динамическая пользовательская маршрутизация в рельсах

Если у меня есть эти три пути ссылки разные книги:

/book/chapter/page 

/book/chapter/page/sentence 

/book/page/sentence 

Различные книги, которые я храню в БД (MongoDB) имеют различные иерархии, но все они начинаются с книги и END с Предложением, это просто средняя часть меняется.

Моя текущая логика маршрутов обрабатывать все это в RoutesController:

Маршруты

get '*path', to: "routes#route" 

Маршруты # прокладывайте

def route 
    path = params[:path].split("/") 


    ## Look up the book 
    book = Book.find_by(name: path[0]) 

    ## Get the book specific hierarchy, like ["books", "pages", "sentences"] 
    ## or ["books", "chapters", "pages", "sentences"] 
    hierarchy = book.hierarchy 


    if path.length == hierarchy.length 
     ## Since end of hierarchy is always sentence 
     ## Here is want to redirect_to Sentence#Show 
    else 
     ## Here I want to look up based on model specific hierarchy 
     ## LOOKUP CONTROLLER: hierarchy[path.length-1]}", ACTION: Show 
     ## eg: Chapter#show, Subchapter#show, Page#show, etc. 
    end 
end 

Я не могу сделать простой redirect_to, потому что я не используя файл config/routes, чтобы он выдавал ошибку:

No route matches {:action=>"show", :controller=>"chapters", :path=>"books/chapters"} 
+0

Какие у вас модели и как они связаны? –

ответ

1

Я знаю, что вы не хотите использовать маршруты по умолчанию, но вы можете заставить их работать.

scope ':bookName' do 
    scope '(:chapter)', :chapter => /c\d+/ do #we need to know if it's a chapter 
    scope '(:page)', :page => /p\d+/ do #or a page, c1 = chapter, p1 = page 
     resources :sentence 
    end 
    resources :page 
    end 
    resources :chapter 
end 

() сделать часть пути опциональной.

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