将Sunspot用作搜索引擎时,我遇到了两个问题。
第一个问题是我有一个链接到search/index
,当它这样做时显示我数据库中的所有产品,这是我不想要的全部。我该怎么做才能显示没有结果,用户必须使用搜索字段?
第二个问题是当用户输入空白搜索" "
时,它会返回数据库中应该返回"No Search Results Found"
的所有产品。如何才能做到这一点?
class SearchController < ApplicationController
def index
@search = Product.search do
fulltext params[:search]
end
@products = @search.results
end
end
resources :search, :only => [:index]
class Product < ActiveRecord::Base
attr_accessible :name
# Sunspot config
searchable do
text :name
end
end
<%= form_tag search_path, :method => :get do %>
<p>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "Search", :name => nil %>
<% end %>
答案 0 :(得分:2)
你可以通过1次修复解决这两个问题。
# /app/controllers/search_controller.rb
class SearchController < ApplicationController
def index
@products = []
# If the search param with it's whitespace stripped off
# actually has something left then search for it
unless params[:search].nil? || params[:search].strip.empty?
@search = Product.search do
fulltext params[:search]
end
@products = @search.results
end
@products
end
end
# /app/views/search/index.haml
- if @products.empty?
Your search did not return any results.
- else
# display the results or do whatever you want to do when something is actually found
基本上我建议你通过将@products
设置为空数组来启动SearchController #index。如果传入搜索参数,我们检查它的剥离结果(删除了空白区域)并查看是否还有其他内容。
如果用户搜索了一堆空格,那么strip
会将其减少为空,搜索将无法运行。
如果搜索参数的剥离版本确实存在某些内容(也可能是有效的搜索文本),则执行搜索并将@products
设置为结果集。
最后,返回@products
。
在您的视图中,您可以检查@products
数组以查看它是否为空。如果它是空的,则用户搜索空格(伪造)或者他们的搜索没有返回任何内容......所以你可以根据它采取适当的行动。