路径助手改变" /搜索?选项= ..." to" /search.option = ..."何时指定锚点

时间:2016-05-16 19:21:19

标签: ruby-on-rails ruby-on-rails-5

我有一个看似简单的案例与Rails'路径助手。我的路线很简单:

C:\\Users\\georg\\Desktop\\XY.txt 
C:\\Users\\georg\\Desktop\\XY.txt
C:\\Users\\georg\\Desktop\\XY.txt

我需要在当前页面的查询字符串中注入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

1 个答案:

答案 0 :(得分:3)

经过一些测试后发现你应该在合并参数时包含锚点

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参数理解为格式说明符(我通过调试帮助程序中的路径构造发现了这一点,但我无法指向源代码中的精确位置)这就是生成的路径在资源名称后面包含点.的原因。

更新:请注意,query_parameters也必须转换为哈希值,因为它们通常属于ActionController::Parameters,并且在路径助手中的处理方式也不同。将所有参数和锚点统一到Hash类之后,路径应该是正确的。