我对Rails的路径助手有一个看似简单的案例。我的路线很简单:
get 'search', to: 'search#search_results'
$ rails routes
...
search GET /search(.:format) search#search_results
我需要option=graph
在当前页面的查询字符串中注入一个参数。这可以按预期工作:
<%= link_to "Graphs", search_path(request.query_parameters.merge({:option => "graphs"})) %>
给出这样的链接:
http://localhost:3000/search?body=&commit=Search&feedback=&option=graphs&reason=&site=&title=&user_rep_direction=%3E%3D&user_reputation=0&username=&utf8=%E2%9C%93&why=foo
但是,当我指定anchor
参数时,会发生一些奇怪的事情:
search_path(request.query_parameters.merge({:option => "graphs"}), anchor: "graph-1")
http://localhost:3000/search.body=&commit=Search&feedback=&option=graphs&reason=&site=&title=&user_rep_direction=%253E%253D&user_reputation=0&username=&utf8=%25E2%259C%2593&why=foo#graph-1
锚已按预期添加,但是?
开始查询字符串的变成.
-,因为它是无法识别的格式,这会激怒控制器。
为什么会发生这种情况,我该如何解决?
在Ruby 2.2.2上运行Rails 5 beta 4
经过一些测试,结果表明合并参数时应包括锚点:
search_path(request.query_parameters.to_h.merge({option: "graphs", anchor: "graph-1")})
说明:您的方法,即:
search_path(request.query_parameters.merge({:option => "graphs"}), anchor: "graph-1")
实际上将两个单独的哈希作为参数传递给search_path
助手,而不只是一个。但是,在帮助程序定义代码中,仅最后一个哈希参数被用作帮助程序的实选项参数。其他参数的处理方式有所不同。
最后,该anchor
参数被帮助程序理解为格式说明符(我通过调试帮助程序中的路径构造发现了这一点,但无法指向源代码中的确切位置),这就是为什么生成的路径包含.
资源名称后的点。
更新:请注意,query_parameters
还必须将其转换为哈希值,因为它们通常属于,ActionController::Parameters
并且在路径帮助器中的处理方式也有所不同。统一所有参数和Hash
类的锚点后,路径应正确。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句