Как создать SEO-URL в Rails 3.x с большим количеством необязательных параметров URL? - PullRequest
0 голосов
/ 24 февраля 2012

Хорошо, я пытаюсь сделать мои URL-адреса более дружественными и получить немного больше индексации сока от Google. По сути, у меня есть несколько URL, которые выглядят так:

/ статьи? Страница = 2 & фильтр = все

и я хочу, чтобы это выглядело так

/ статьи / все / 2

Мне нужно, чтобы часть / artiles /: filter /: page работала так же хорошо, как мои маршруты:

resources: :articles do
  get '(:filter(/:page)', action: :index, on: :collection
end

У меня вопрос, как заставить параметры страницы работать без фильтра (или других необязательных параметров)?

/ статьи /? Страница = 2

должно выглядеть как

/ статьи / 2

Я думал об использовании ограничений, но не могу заставить его работать, что-то вроде этого

resources: :articles do
  get ':page', action: :index, on: :collection, constraints: { page: /\d+/ }  
  get '(:filter(/:page)', action: :index, on: :collection
end

EDIT

Я не осознавал этого, но вышесказанное работает, а ссылка - не генерирует красивые URL. например / Articles / All / 1, он все еще выводит / статьи? фильтр = все. Это код ссылки, который я использую:

= link_to "Filter", articles_path(filter: 'all') #=> /articles?filter=all

и я хочу: / статьи / все и / статьи / все / 2 и / статьи / 2 и все работы.

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Почему бы не добавить слово "page" в URL, чтобы помощник по маршрутизации знал, что он вызывает страницу и не передает имя фильтра:

/articles/page/1

В маршрутах.рб

resources :articles do
  get 'page/:page', action: "index", on: :collection, constraints: { page: /\d+/ }, as: :articles_with_page
  get ':filter/page/:page', action: :index, on: :collection, as: :articles
end 

Скобки означают, что эта часть имени маршрута является необязательной. Поскольку в вашем случае вы достаточно точно описываете шаблон, которому он должен соответствовать, он удалит их.

Кроме того, вы назвали пространство имен фильтра :articles - оно будет конфликтовать с индексным маршрутом по умолчанию, поэтому вы должны либо переименовать его, либо передать except: [:index] в блок ресурсов:

resources except: [:index] do
  # stuff here
end

Надеюсь, это поможет

0 голосов
/ 24 февраля 2012

Это не красиво, но это может привести вас в правильном направлении.

module ApplicationHelper
  def articles_with_optional_page_path(params)
    if params[:page] && !!params[:filter]
      articles_with_page_path(params)
    else
      articles_path(params)
    end
  end
end

resources: :articles do
  get ':page', action: :index, on: :collection, constraints: { page: /\d+/ }, as: :articles_with_page
  get '(:filter(/:page)', action: :index, on: :collection, as: :articles
end
...