undefined方法`stringify_keys!' for“”:使用meta_search时的字符串

时间:2014-04-18 14:10:19

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

这是我的_search_box.html.erb文件

<%= form_tag "/catalog/search", :method => "get" do %>
  <%= text_field_tag :q %> 
  <%= submit_tag 'Search' %>
<% end %>

search.html.erb中呈现:

<%= render :partial => 'search_box' %>
<% if @products %>
    <%= render(:partial => "products") %>
<% end %>

这是search类的CatalogController方法:

  def search
    @search = Product.search(params[:q].to_s)
    @products = @search.all
    unless @products.size > 0
      flash.now[:notice] = "No results."
    end
  end

访问/catalog/search

时出现此错误
NoMethodError in CatalogController#search

undefined method `stringify_keys!' for "":String

我正在使用meta_search gem进行搜索。

发生了什么事?

1 个答案:

答案 0 :(得分:1)

您不应该将要搜索的内容的值直接放入qq应该是所有搜索条件的哈希值。例如:

q: { name_contains: 'something interesting', price_less_than: '100' }

像这样,搜索条件进入params[:q]的控制器。如果您不想使用此哈希并且只有一个搜索字段用于产品名称,那么如果您想要进行子字符串匹配,请将视图更改为:

<%= text_field_tag :name_contains %>

或者,如果你想做一个完全匹配:

<%= text_field_tag :name_equals %>

并将您的控制器搜索方法更改为:

def search
  @search = Product.search params
  ...

但是,如果您使用这种方法,那么请注意,您永远不会有任何非搜索相关参数,否则它们也将转到MetaSearch,这就是通常您应该使用q哈希的原因。

最后,MetaSearch宝石已经很老了,现在不再维护了。如果您刚刚开始设置搜索,可以查看Ransack,而不是简单模式基本上是对MetaSearch的重写。