这是我的_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进行搜索。
发生了什么事?
答案 0 :(得分:1)
您不应该将要搜索的内容的值直接放入q
。 q
应该是所有搜索条件的哈希值。例如:
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的重写。