0

「Time.now.strftime」関数の目的で、60 秒ごとにページを更新する単純な小さな関数を作成しました。ただし、検索を実行すると、最終的に検索結果でページが更新され、次のエラーが表示されます。

nil を String に変換できません

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"

どんな助けでも感謝しますありがとう

4

4 に答える 4

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?条件にヒットしてエラーが発生します。

于 2012-11-09T02:11:01.467 に答える
0

少し違った方法で文字列を連結すると、検索文字列が nil であっても問題ありません。代わりに、次のようにしてみてくださいsearch_string = "%#{ search_string }%"。これにより#{}、文字列にキャストされる結果が生じます。

于 2012-11-09T07:08:35.730 に答える
0

このエラーは、文字列 "%" を NilClass (nil) に連結しようとしたために発生します。

最も迅速な修正は、次のことを行うことです。

LINE 37 のコード:

search_string = "%" + search_string + "%"

次のように変更する必要があります。

search_string = "%#{search_string}%"

メソッドをリファクタリングするというカイルの提案も良いものです。

于 2012-11-09T07:12:12.137 に答える
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

さらに良いことに、keyin パラメータを確認してください:

if params.key?(:search_string)
  # do search
else
  # panic
end
于 2012-11-09T02:03:16.830 に答える