指定锚点时,路径助手将“/search?option=...”更改为“/search.option=...”
Path helper changing "/search?option=..." to "/search.option=..." when anchor is specified
我有一个使用 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"})) %>
给出一个 link 这样的:
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
按预期添加了锚点,但开始查询字符串的 ?
变成了 .
- 这会激怒控制器,因为它是一种无法识别的格式。
为什么会发生这种情况,我该如何解决?
运行 Rails 5 beta 4 Ruby 2.2.2
经过一些测试,结果表明您应该 在合并参数时包含锚点:
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
助手而不是一个。但是,在 helper definition code 中,只有 最后一个散列 参数被用作帮助程序的实际选项参数。其他参数的处理方式不同。
最后,anchor
参数被 helper 理解为 format 说明符(我通过调试 helper 中的路径构造发现了这一点,但我无法指向源代码中的精确位置),这就是为什么生成的路径在资源名称后包含一个点 .
。
更新: 请注意,query_parameters
也必须转换为散列,因为通常它们属于 ActionController::Parameters
并且处理方式也不同在路径助手中。将所有params和anchor统一为一个Hash
class后,路径应该是正确的。
我有一个使用 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"})) %>
给出一个 link 这样的:
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
按预期添加了锚点,但开始查询字符串的 ?
变成了 .
- 这会激怒控制器,因为它是一种无法识别的格式。
为什么会发生这种情况,我该如何解决?
运行 Rails 5 beta 4 Ruby 2.2.2
经过一些测试,结果表明您应该 在合并参数时包含锚点:
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
助手而不是一个。但是,在 helper definition code 中,只有 最后一个散列 参数被用作帮助程序的实际选项参数。其他参数的处理方式不同。
最后,anchor
参数被 helper 理解为 format 说明符(我通过调试 helper 中的路径构造发现了这一点,但我无法指向源代码中的精确位置),这就是为什么生成的路径在资源名称后包含一个点 .
。
更新: 请注意,query_parameters
也必须转换为散列,因为通常它们属于 ActionController::Parameters
并且处理方式也不同在路径助手中。将所有params和anchor统一为一个Hash
class后,路径应该是正确的。