为什么我的搜索会在搜索时显示所有结果?

时间:2014-02-25 20:05:39

标签: ruby-on-rails ruby-on-rails-4

我在我的产品索引页面上设置搜索PgSearchWill-Paginate,如下所示:

的ProductsController

def index
  @products = Product.text_search(params[:query]).page(params[:page]).per_page(5)
end

产品型号

 include PgSearch
 pg_search_scope :search, 

 def self.text_search(query)
   if query.present?
     search(query)
   else
     scoped
   end
 end

产品索引页

<%= form_tag products_path, method: :get do %>
  <%= text_field_tag :query, params[:query] %>
  <%= submit_tag "Search", name: nil %>
<% end %>

<% if @products.blank? %>
  No Results
<% else %>
  <% @products.each do |product| %>
   <%= product.name %>
  <% end %>
<% end %>

但我现在遇到的问题是,当我进入产品索引页面时,它会显示所有产品,我希望它在搜索完成之前不显示任何内容。如果搜索为空白,请返回无结果,但是当您第一次点击该页面时,它应该不显示任何内容。怎么会这样做?

3 个答案:

答案 0 :(得分:2)

您可能希望仅在存在搜索参数时运行text_search。您可以将此逻辑放入视图,控制器或模型中。

在视图中

<% if params[:query].present? %>
  <% if @products.blank? %>
    No Results
  <% else %>
    <% @products.each do |product| %>
      <%= product.name %>
    <% end %>
  <% end %>
<% end %>

在控制器中

def index
  if params[:query].present?
    @products = Product.text_search(params[:query]).page(params[:page]).per_page(5)
  else
    @products = Product.none # NOTE: Rails 4 only
  end
end

在模型中

# create a new method to encapsulate this search logic then use it in the controller
def self.search(value)
  if value.present?
    Product.text_search(value)
  else
    Product.none # NOTE: Rails 4 only
  end
end

俗话说“胖模型,瘦模控制器”,所以你可能想要选择模型方法,这样可以让你的控制器和视图更简单。

答案 1 :(得分:1)

将显示逻辑放在if语句中:

<% if params[:query].present? %>
  <% if @products.blank? %>
    No Results
  <% else %>
    <% @products.each do |product| %>
      <%= product.name %>
    <% end %>
  <% end %>
<% end %>

答案 2 :(得分:1)

虽然我不熟悉pg搜索是如何工作的,但你可以在你的方法中做这样的事情。

这是一个很好的重构,它避免检查存在并对params做出决定(代码气味)

def self.text_search(query = "")
     search(query)
end

正如我所说,不确定pg_search的工作原理。也许当您浏览任何内容时,它会返回所有记录。如果是这样的话,你可以让它返回一个空数组。这样的事情可以做到

 def self.text_search(query)
    return [] if query.nil?
    search(query)
 end