Ruby on Rails - 无法将nil转换为字符串

时间:2012-11-09 01:59:29

标签: ruby-on-rails ruby-on-rails-3.2

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

无法将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 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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?条件并闪烁错误。

答案 2 :(得分:0)

如果以稍微不同的方式连接字符串,则搜索字符串为nil无关紧要。试试这样,而不是:search_string = "%#{ search_string }%"。这将导致#{}中的任何内容被强制转换为字符串。

答案 3 :(得分:0)

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

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

第37行的代码:

search_string = "%" + search_string + "%"

应更改为:

search_string = "%#{search_string}%"

凯尔建议重构该方法也是一个很好的建议。