0

我编写了一个简单的小函数,它每 60 秒刷新一次页面,用于“Time.now.strftime”函数。但是,当我执行搜索并最终使用搜索结果刷新页面时,我收到以下错误,我无法弄清楚:

无法将 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"

任何帮助将不胜感激谢谢

4

4 回答 4

0

如果你连接你的字符串有点不同,搜索字符串是否为零无关紧要。试试这样,而不是:search_string = "%#{ search_string }%". 这将导致任何东西都#{}被转换为字符串。

于 2012-11-09T07:08:35.730 回答
0

该错误是由试图连接到 NilClass (nil) 的字符串“%”引起的。

最快的解决方法是执行以下操作。

第 37 行的代码:

search_string = "%" + search_string + "%"

应改为:

search_string = "%#{search_string}%"

Kyle 提出的重构方法的建议也是一个不错的建议。

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

考虑如果您没有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 回答