2013-10-15 153 views
0

我試圖在我的rails應用程序中創建一個搜索表單。我查了各種解決方案,但他們對我來說毫無意義。學習在Rails中搜索

當我在導軌應用程序中通過窗體運行搜索時,出現以下錯誤。現在我的關注點(除了錯誤)是我的索引操作中的實例變量@computers。我很確定這不是'軌道'來正確完成搜索,並會喜歡一些建議。

錯誤

undefined method `%' for #<Array:0x5780460> 

參數搜索

http://localhost:3000/computers?utf8=%E2%9C%93&direction=&sort=&search=bob 

搜索表單後

<%= form_tag computers_path, method: "get" do %> 
     <%= hidden_field_tag :direction, params[:direction] %> 
     <%= hidden_field_tag :sort, params[:sort] %> 
     <%= text_field_tag :search, params[:search] %> 
     <%= submit_tag "Go", name: nil, class: "btn btn-primary" %> 
<% end %> 

呼叫的方法

def index 
    @computers = Computer.where(school_id: current_user.school_id).search(params[:search]).category(params[:category]).order(sort_column + " " + sort_direction) 
end 

方法

def Computer.search(search) 
    if search 
     search = search.downcase 
     params = [] 
     values = {} 

     column_names.each do |c| 
     params << "#{c} LIKE #{c.to_sym}" 
     values[c.to_sym] = search 
     end 

     params.join (' OR ') 
     where(params,values) 
    else 
     all 
    end 
    end 
+0

發佈您的代碼。 –

+0

什麼行會拋出該錯誤? –

+0

其中(params,values),當我定義同樣的方法時,它在軌道控制檯中也發生了孤立。 – Corey

回答

0

你有正確的想法,但調用.join方法不改變它被調用的對象,它只是返回字符串表示。您需要將返回值存儲在變量中,如下所示:paramsStr = params.join(' OR ')。然後簡單地通過paramsStr到where子句。

最終,這是什麼導致你的unidentified method % for Array ....錯誤;這個版本的where方法期望第一個參數是一個字符串。查看this documentation,關於佔位符條件的部分。

希望有所幫助。

+0

至於方法本身,我個人從來沒有這樣做過搜索,但從我所知道的情況來看,我認爲這種方法很好。我相信你可以找到重構它的方法,但是否則,我不知道如何在純SQL中執行這樣的方法,而無需編寫過程或手動編寫每列。 –

+1

這有助於非常感謝你。現在看來很明顯,你指出了這一點。謝謝! – Corey