我在我的产品索引页面上设置搜索PgSearch和Will-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 %>
但我现在遇到的问题是,当我进入产品索引页面时,它会显示所有产品,我希望它在搜索完成之前不显示任何内容。如果搜索为空白,请返回无结果,但是当您第一次点击该页面时,它应该不显示任何内容。怎么会这样做?
答案 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