从参数中合并散列的麻烦 - "未定义的方法to_hash"

时间:2018-03-14 17:14:32

标签: hash ruby-on-rails-5 query-string

我正在尝试构建一个显示类别列表的页面。当您单击其中一个时,您将进入同一页面,但现在使用您刚刚选择的类别的新查询字符串。然后,您可以选择另一个类别,允许它们堆叠。 URL最终可能如下所示。

http://localhost:3000/filter?categories%5B%5D=restaurant&categories%5B%5D=takeout

在我的Rails视图中,我使用link_to来构建这些网址。如果查询字符串中没有现有类别,我只需在问题永久链接中传递类别符号和类别的单个数组。当存在现有类别时,我想将新类别插入request.query_parameters类别数组中,然后将其与request.query_parameters整体合并。这样我将来也可以有子类别和订单/排序查询。

<% @categories.each do |category| %>

    <% if !params.has_key?(:categories) %>
        <%= link_to category.category_name, shops_path(categories: [category.permalink]) %>
    <% else %>
        <%= link_to category.category_name, shops_path(request.query_parameters.merge(request.query_parameters[:categories] << category.permalink)) %>
    <% end %>

<% end %>

然后,我将使用永久链接在我的数据库中搜索具有匹配永久链接的类别,并显示与URL中查询字符串中的至少一个类别匹配的结果。

点击第一个链接会为以下网址中的request.query_parameters创建这样的哈希。

{"categories"=>["restaurant"]}
http://localhost:3000/filter?categories%5B%5D=restaurant

我会从第二个开始,就像从下面的URL创建一个这样的哈希。

{"categories"=>["restaurant","takeout"]}
http://localhost:3000/filter?categories%5B%5D=restaurant&categories%5B%5D=takeout

但是,我收到以下错误消息。

undefined method `to_hash' for ["restaurant", "takeout"]:Array
Did you mean?  to_h

Request
Parameters:

{"categories"=>["restaurant", "takeout"]}

如何解决此错误?

修改

找到了解决方案,所以将其作为答案发布。

2 个答案:

答案 0 :(得分:0)

查看您编写的日志和代码,您正在尝试将哈希合并到类别数组中,这不是正确的方法。

修改代码如下:

<%= link_to category.category_name, shops_path(request.query_parameters[:categories] << category.permalink) %>

上面一行将推送类别数组中的新类别,当在控制器中接收查询参数时,附加类别将合并到请求参数中。

答案 1 :(得分:0)

我找到了解决方案。如果您没有DbNull.Value 哈希中的密钥,则只需要将数组与categories:的密钥合并。如果您已经拥有该密钥,则可以使用request.query_parameters添加新的category.permalink

因此,解决方案已扩展到三个条件。

  1. 根本没有参数
  2. 参数,但没有+=
  3. 的键
  4. 参数,键为categories:
  5. 希望这将有助于其他人!

    categories: