我有一个包含项目列表的页面,在列表上方,我有多个充当过滤器的链接。单击链接会导致使用大量URL参数触发ajax请求。点击几个过滤器后的任何一组示例:
?letters=a-e&page=1&sort=alphabetically&type=steel
一切正常但我觉得URL上的params非常混乱,后面的代码需要做很多检查,看看哪些params存在,合并新的params,覆盖现有的params等。
如果没有网址参数,有没有更好的方法来实现这一目标。
我认为这样做的缺点是用户无法链接到特定的过滤视图,或者是否有办法实现这一目标?
答案 0 :(得分:1)
使用长查询字符串时有几个选项。如果这不是真的导致问题(比如请求死亡),那么你应该问问自己,是否真的值得将其转换为其他东西。
使用POST请求
如果查询字符串的长度导致问题,您可以切换到使用POST请求而不是来自过滤器链接的GET请求。这将阻止URL包含过滤器参数,但您的控制器仍然可以以相同的方式处理参数。
可以将link_to
助手设置为使用不同的HTTP谓词,如下所示:
link_to("My Filter", filter_path, method: :post)
如果您使用此技术,请确保正确更新路线。
使用Ajax请求刷新页面
如果将过滤器配置为所有远程(Ajax)链接,则可以更新过滤器并刷新页面的内容,而无需更改URL。这是解决方案的基本模式:
在用户的会话中存储过滤器
如果您在会话中存储当前过滤器,则只要用户访问基页,您就可以检索存储的过滤器并仅显示相应的信息。您的过滤器链接仍然可以是GET请求(包括冗长的查询字符串),但不是在过滤器请求之后呈现页面,而是重定向回主列表而不需要额外的查询参数。这会让用户觉得网址永远不会改变,甚至可以让你记住他们离开后的最后一个过滤器。
分享链接
正如您所提到的,共享链接成为所有这些解决方案的问题。您可以提供"分享此过滤器"页面上的部分,以帮助缓解这一点。您将放置用户可以在该部分中复制的URL,其中包含重新创建过滤器所需的信息。链接可以包含完整的查询字符串,也可以包含过滤器的编码版本。