Rails 3 - url中的友好参数(GET)

pro*_*int 2 url ruby-on-rails

我有一个rails 3应用程序,现在我为我的目录实现过滤器.过滤器通过GET请求将数据传递给控制器​​.因此,在我提交表单(应用搜索)后,我在浏览器中有这样的链接:

http://localhost:3001/shoes?filter%5BShoeBottomType%5D%5B%5D=2&filter%5BShoeClassification%5D%5B%5D=1&filter%5BShoeClassification%5D%5B%5D=2&filter%5BShoeElation%5D%5B%5D=3&filter%5BShoeElation%5D%5B%5D=4&filter%5BShoeElation%5D%5B%5D=5&filter%5BShoeLiningColor%5D%5B%5D=2&filter%5BShoeLiningColor%5D%5B%5D=3&filter%5BShoeLiningColor%5D%5B%5D=4&filter%5BShoeTopColor%5D%5B%5D=1&filter%5BShoeTopColor%5D%5B%5D=2&filter%5Bonly_action%5D%5B%5D=1&page=2
Run Code Online (Sandbox Code Playgroud)

有没有办法让URL更漂亮?

PS我不想使用POST请求,因为我读到它对SEO不好

小智 7

TLDR:离开吧.

HTML表单以直接的方式序列化; 参数以HTML元素命名.这里的实际问题是如何命名表单元素.看起来他们有像这样的名字filter[ShoeBottomType][]; 查看您的HTML以查看name属性.因为你在Rails中,我猜你有一个过滤器哈希作为单个参数传递给你的Rails控制器方法,并且因为Rails希望哈希使用某种URL 格式来表示哈希和数组(它必须知道如何反序列化它来自请求),表单助手以这种方式编写表单.你的特别复杂,因为哈希值是数组,因此额外的括号集.然后它的URL编码,你最终得到一个丑陋的混乱.

您可以通过将输入单独传递回控制器而不是作为大哈希来避免某些问题.就像是:

def index
  shoe_bottom_types = params[:bottom_types]
  shoe_classifications = params[:classifications]
  shoe_elations = params[:elations]
  ...
Run Code Online (Sandbox Code Playgroud)

这会让你:/shoes?bottomTypes[]=1&bottomTypes[]=2....这似乎没有那么好,现在你的控制器都很糟糕.如果你想拥有多个相同的过滤器,我不会看到你如何完全摆脱括号.我想你可能会疯狂并在你的控制器中进行自己的解析,就像拆散一样shoeBottomTypes=1|2,但是你也必须自己进行表单序列化.再说一次,不值得.

备份一秒,搜索引擎优化的东西没有多大意义.搜索引擎不会填写您的表单; 他们只是按照链接.你应该使用GET的真正原因是(大概),提交你的表单没有副作用,因为它只是一个搜索.看到这里 ; 使用正确的HTTP方法很重要.如果您使用POST,则会在重新加载时收到奇怪的警告,并且您将无法为搜索添加书签.

进一步支持,为什么你关心,特别是现在SEO已经不在了?就像一个快速演示,我做了谷歌搜索"事物"这个词,这是URL:

https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=thing&pbx=1&oq=thing&aq=f&aqi=g2g-s1g1&aql=1&gs_sm=3&gs_upl=764l1877l0l1980l6l6l0l0l0l0l89l432l5l5l0&bav=on.2,or.r_gc.r_pw.r_cp .r_qf.,cf.osb&FP = 220ef4545fdef788&BIW = 1920&波黑= 1086

因此,表单提交的URL可能很长.用户甚至不会看它.

我可以想到的唯一可能是你为什么关心你的URL的长度/丑陋,这是你想要与表单分开创建指向某些搜索的链接.有几种方法可以解决这个问题,但由于我不知道这是否与您相关,我会将其作为后续行动.

所以底线,它看起来像我期望的,并试图修复它听起来丑陋和毫无意义.