2012-11-08 90 views
0

這是我在努力實現我的Rails應用程序,新建軌所以​​請原諒我一個簡單的搜索,如果我已經取得了一些重大失誤搜索表單不返回預期

我第一次嘗試搜索表單,看起來像這樣

<%= form_tag({:controller => 'search', :action => 'search'}, {:method => 'get'}) do |s| %> 
    <%= text_field_tag :search, params[:search] %> 
    <%= submit_tag "Search" %> 
    <% end %> 

我控制器

def search 

@countrysearch = Recipe.find(params[:search]) 
end 

現在我正在我的輸出結果,像這樣

<h4>output</h4> 
    <%= @countrysearch %> 

我得到的輸出,但如果我尋找像威爾士一個字,我得到一個錯誤說不能根據ID找到,但如果我尋找像17的ID,然後我得到

#<Recipe:0x97b0fa8> 

我已經調查過的find_by_sql方法,但我對此的理解是還沒有實現,IM unsre語法的搜索依賴於我輸入的字符串,但我想這並不重要因爲PARAMS是搜索領域的內容?

如果有任何可以幫助那將是非常讚賞

感謝

回答

1

模型find方法(Recipe.find())預計實例(特定配方)的數字ID。但看起來你正在按國家名搜索。在Rails中有這樣做的方法有很多。不過,首先我假設你的配方模型有一個像「country」這樣的屬性,其值就像「Wales」。

如果是這樣,那麼你可以讓你的搜索方法是這樣的:

def search 
    @countrysearch = Recipe.find_by_country(params[:search]) 
end 

或者你也可以使用Rails中的新方法3

def search 
    @countrysearch = Recipe.where(:country => params[:search]) 
end 

不要使用find_by_sql - 它會起作用,並且這並不壞,但是你錯過了Rails的一些主要功能。

有幾個值得一提的其他東西:

  • 你會在視圖中得到一個錯誤,如果沒有搜索到任何結果。引用@countrysearch實例變量,用於測試使用零或if @countrysearch.nil?爲正的情況下if @countrysearch.present?
  • 機會是會有來自威爾士的一個以上的配方,所以我們期待不是Recipe回一個實例,但它們的集合之前 - 在你的看法,迭代使用 <%@ countrysearch.each do | recipe | %> <%= recipe.name%> ... <%結束%>
  • 同樣,如果您使用的查找方法,你應該用Recipe.find_all_by_country
  • 走在配方模型存儲國名不一個偉大的做法。創建一個包含國家的模型。(!「威爾士」 =「威爾士」)
  • 你可能想不區分大小寫的搜索
+0

感謝你在清除了有關該方法的.find啊,我現在得到的結果返回# Richlewis

+0

哦,失蹤)搜索後:) – Richlewis

+0

我正在糾正失蹤),並添加更多的評論,應該澄清,因爲你正在嘗試:-)。使用'each'迭代器將強制''做它的事情並且實際執行執行搜索的SQL。如果由於某種原因,你需要結果作爲一個數組,你可以做'@countrysearch = Recipe.where(:country => params [:search]).'全部' –