Ruby on Rails - настраиваемая маршрутизация для ресурса обзора с страницей индекса / шоу и пагинацией - PullRequest
0 голосов
/ 27 июня 2011

Я застрял в очень сложной проблеме, связанной с маршрутами Rails 3, и недостаточно хорош для маршрутов, чтобы понять это самостоятельно.У меня есть ресурс "Отзывы", в котором есть только действия "Показать" и "Индекс".Я использую гем Friendly ID для идентификаторов с добавленными тегами, а также у меня есть ресурс с вложенными комментариями, который позволяет людям комментировать отзывы.

resources :reviews, :only => [:index, :show] do
  resources :comments, :only => [:new, :create]
end 

Таким образом, мои пути к странице индекса - это просто «отзывы» и что-то вроде «обзоры / матрица» для действия шоу.Пока все достаточно просто.

Теперь, во-первых, я натолкнулся на своего рода главную страницу индекса.У меня есть гем will_paginate на странице индекса, и я кеширую страницу.Проблема в том, что кэширование не будет работать, когда путь будет выглядеть примерно так: / reviews? Page = 2, скорее, мне нужно указать путь / reviews / 2 / при разбивке на страницы, поэтому я добавил в приведенный выше предыдущий ресурс обзорасделать эту работу.

match 'reviews(/:page)' => 'reviews#index', :constraints => { :page => /[0-9]/ }

Почему ограничение?Потому что мой маршрут ресурса «Показать» не работает, потому что вышеприведенная строка - без ограничения числа - в конечном итоге оказывается «универсальной», которая мешает маршруту «Показать».Поскольку идентификатором действия показа всегда будут слова, в то время как у страниц индекса в индексе всегда есть номер, вот почему я сделал это следующим образом.

Но вот в чем дело, я не хочумаршрут «Показать» должен быть просто «обзоры / матрица».Понимаете, все рецензии классифицированы по типу рецензируемой вещи, поэтому мне бы очень хотелось, чтобы путь "Показать" был чем-то вроде "рецензий / фильмов / матриц" или "рецензий / книг / лордов кольца". '

Я бы предпочел использовать оригинальный путь' Показать 'рецензий для дополнительных страниц индекса категории, таких как' рецензии / книги '.(Еще одна причина вышеуказанного ограничения.) Но я собираюсь сохранить это для другого вопроса SO, поскольку я не хочу усложнять этот вопрос.

Итак, вернемся к предыдущему вопросу.Обычно я думаю, что вышеупомянутое может быть решено простым маршрутом «соответствия» (с маршрутизацией?), За исключением того, что у нас есть вложенные комментарии в ресурсе Reviews.Как мне создать страницы «Показать», как описано выше, при этом сохраняя вложенный ресурс Комментарии в Обзорах?

1 Ответ

0 голосов
/ 04 июня 2012

Без пота (если вы это имеете в виду).

match 'reviews(/:page)' => 'reviews#index', :constraints => {:page => /[0-9]+/}
match 'reviews/comments/:id' => 'comments#my_action', :constraints => {:id => /[0-9]+/}
match 'reviews/:path' => 'reviews#show', :constraints => {:path => /.+/}
  • Добавление ограничения к третьей инструкции позволит вам использовать / в вашем :path.(Это правда: использование никаких ограничений вообще не позволит foo/bar соответствовать этому шаблону.) (В качестве альтернативы регулярному выражению /.+/, вы можете пожелать /[a-zA-Z/]+/, но это не должно иметь значения, так как более ранние пути уже перехватывают всеэто не должно быть #show.)
  • Порядок имеет значение.Сохраните эти три в том порядке, в котором они появляются.
...