2012-11-09 81 views
0

我寫了一個簡單的小函數,每60秒刷新一次頁面以達到'Time.now.strftime'函數的目的。然而,當我執行搜索,並最終前來與搜索結果我碰到下面的錯誤,我想不出來刷新頁面:Ruby on Rails - 無法將nil轉換爲字符串

不能轉換零到字符串

app/models/product.rb:37:in `+' 
app/models/product.rb:37:in `fuzzy_search' 
app/controllers/products_controller.rb:92:in `search' 

def self.fuzzy_search(search_string) 
    (LINE 37) search_string = "%" + search_string + "%" 
     self.find(:all, :conditions => ["title LIKE ?", search_string]) 
    end 

(LINE 92) @products = Product.fuzzy_search(params[:search_string]) 
     if @products.empty? 
      flash.now[:alert] = "No records found - displaying all records..." 
      @products = Product.find :all, :order => 'title' 
     end 
     render :action => "index" 

任何幫助將不勝感激 感謝

回答

0

考慮,如果你不提供在請求一個search_string參數會發生什麼:

search_string = params[:search_string] # nil 

而不是運行與nil說法搜索的,它可能是有意義的處理意料之外的空虛:

unless params[:search_string].nil? 
    @products = Product.fuzzy_search(params[:search_string]) 
else 
    abort('Search with something!') # don't actually do this 
end 

更妙的是,只是檢查了key在PARAMS:

if params.key?(:search_string) 
    # do search 
else 
    # panic 
end 
0

你帕拉姆search_stringnil

我將修改fuzzy_search

def self.fuzzy_search(search_string) 
    return [] unless search_string 
    self.find(:all, :conditions => ["title LIKE ?", "%#{search_string}%"]) 
end 

使用此更改,@products將爲空,並且您的代碼將遇到@products.empty?條件並閃爍顯示錯誤。

0

如果以不同的方式連接字符串,搜索字符串爲零並不重要。試試像這樣,而不是:search_string = "%#{ search_string }%"。這將導致#{}中的任何內容被轉換爲字符串。

+0

這應該導致所有記錄被返回,對於空搜索,不像其他建議的解決方案,它不返回任何內容。 –

0

錯誤是由試圖連接到NilClass(nil)的字符串「%」引起的。

最快的解決方法是執行以下操作。

線37的代碼:

search_string = "%" + search_string + "%" 

應改爲:

search_string = "%#{search_string}%" 

凱爾的建議,重構方法也不錯。

相關問題