我想设置
abc.com/news?street=2&area=3$price=6
到
abc.com/news-2-3-6
params街道,区域和价格都是可选的
我的路线喜欢
match "/news(-:street-:area-:price)" => "news#index",:as => :news_index
效果不佳。
答案 0 :(得分:2)
您的路线存在两个技术问题,我也会提到一个大问题。
首先,您要添加一个可选细分(-: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
1}}。要仅指定:price
,您的网址必须与/news-0-0-6
类似。
你这样做的原因也存在根本缺陷。这是不 SEO。对于SEO而言,包含以连字符分隔的数字段的URL 更糟比包含传统查询字符串的URL。至少传统的查询字符串包含一些可索引的术语,例如street
和price
。