2015-08-17 27 views
1

我有搜索表單和搜索結果張貼在同一頁面上。Ransack:表單提交時沒有返回任何內容,也沒有輸入搜索值

據我所知:ransack的默認值是,如果一個表單沒有被輸入到搜索字段的值被提交,那麼返回該特定資源的所有記錄。

如何更改它,以便如果用戶在搜索字段中輸入了沒有值的搜索,則返回的記錄?

Ransack Documentation

這不起作用:

if params["q"].values.present? # Always returns true because an array of empty strings returns true from method call: present? 
    # do this 
else 
    # do that 
end 

無論是做這個的:

if params["q"].values.empty? # Always returns true because an array of empty strings returns true from method call: empty? 
    # do this 
else 
    # do that 
end 

檢查params["q"].present?無法正常工作或因爲每次提交表單時,是否有是否輸入值,這是傳遞給服務器的值:

# showing with pry 
[1] pry> params[:q] 
    => {"namesearch_start"=>"", 
     "city_cont"=>"", 
    } 
[2] pry> params[:q].present? 
    => true # always returns true 

因此params["q"]將始終存在,無論是否輸入值。

回答

1

你可以做的是拒絕任何空白值。

if params[:q].reject { |_, v| v.blank? }.any? # .none? for inverted 
    # Handle search 
else 
    # Handle no query scenario 
end 

或者

if params[:q].values.reject(&:blank?).any? # .none? for inverted 
    # Handle search 
else 
    # Handle no query scenario 
end 
+0

這適用於第一個請求,但不幸的是,所有其他請求這是行不通的。示例:用戶爲字段輸入「foo」的搜索值並單擊搜索。返回結果後,用戶刪除'foo'(現在不搜索值)並再次單擊搜索。即使沒有值,'params [:q]'也會出現,所以默認行爲將會被踢出:所有的記錄都被返回。 – Neil

+0

'present?'和'blank'將檢查鍵*是否具有值*,因此如果'params [:q]'爲空,則'false'表示'present?','true'表示'blank ?',你可以決定怎麼做。只有當條件返回期望的結果時,纔可以推遲到Ransack。 – Mohamad

+0

請參閱我更新的問題中的解釋。 – Neil

相關問題