2014-02-25 245 views
0

我的設置與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 %> 

但是我現在遇到的問題是,當我進入產品索引頁面時,它會顯示所有產品,當我希望它在搜索完成後不顯示任何內容。如果搜索空白,請返回沒有結果但是當您第一次打開頁面時,它什麼也不顯示。這將如何完成?

回答

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 

舊卅一ng會變成「胖模型,瘦身控制器」,所以你可能想選擇模型方法,這會讓你的控制器和視圖更簡單。

+0

我想建議將我的答案標記爲已接受的答案。顯然不是因爲它是我的,而是因爲有太多的if/else實際上是不好的做法。如果接收視圖期望收集,則返回一個。如果沒有產品或沒有產品,它可以是一個空集合。 – lsaffie

1

把你的顯示邏輯if語句裏面:

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