Есть две технические проблемы с вашим маршрутом, и одна большая проблема, о которой я также упомяну.
Во-первых, вы добавляете один необязательный сегмент (-:street-:area-:price)
, что означает, что должны появиться все термины,или нет.Если вы хотите, чтобы каждый сегмент был необязательным, вам необходимо сделать следующее:
match "/news(-:street(-:area(-:price)))" => "news#index"
Во-вторых, вы не указываете, какие символы могут содержать каждое из терминов.В вашем примере news-2-3-6
приведет к установке :street
на «2-3-6» и оставлению :area
и :price
пустыми.Вы должны указать маршруту, какие символы следует принимать для каждого сегмента переменной.Следующее позволяет каждому содержать 1 или более цифр:
match "/news(-:street(-:area(-:price)))" => "news#index",
:street => /\d+/, :area => /\d+/, :price => /\d+/
Но ни одно из этих исправлений не поможет в долгосрочной перспективе.Этот вид «поискового» URL является действительно плохой идеей, потому что каждый сегмент зависит от существования предыдущего сегмента (ов).Я имею в виду, что невозможно поставить :price
без :area
и :street
, и невозможно поставить :area
без :price
.Чтобы указать только :price
, ваш URL должен выглядеть так: /news-0-0-6
.
Ваша причина для этого также в корне ошибочна.Это , а не SEO.URL, содержащий разделенные дефисом числовые сегменты, для SEO хуже , чем URL, содержащий традиционную строку запроса.По крайней мере, традиционная строка запроса содержит некоторые индексируемые термины, такие как street
и price
.