Ruby Rails对象为nil,但控制器逻辑就像对象不是nil

时间:2018-10-24 15:56:59

标签: ruby-on-rails null ruby-on-rails-5.2

我有一个对象Search,其对象为方法listings,如果有搜索结果,该方法将返回一个哈希数组,否则将返回一个空数组。如果有任何空数组,我需要跳过一些代码,直接进入显示页面。我试过object.nil? object.empty? object.present?都得到了相同的结果。...应该为nil的对象被视为非nil。

控制器代码:

def show
    @search = Search.find(params[:id])
    @results = @search.listings
    if @results.last.present?
      if @results.last[0] == "p" || @results.last[0] == "s" || @results.last[0] == "d"
        p "@results.pop is either p, s, or d"
        @sort_column = @results.pop
        @grade = @sort_column.gsub(/[^0-9,.]/, "") unless @results.last[0] == "d"
      end
    end
  end

显示操作结果

undefined method `[]' for nil:NilClass
Extracted source (around line #21):

19        p "@results.pop is either p, s, or d"
20        @sort_column = @results.pop
21        @grade = @sort_column.gsub(/[^0-9,.]/, "") unless @results.last[0] == "d"
22      end
23    end
24  end

但是,服务器界面会验证@ results.last为nil:

>>  @results
=> []
>>  @results.last
=> nil
>>  @results.last.present?
=> false
>>  @results.last[0]
NoMethodError: undefined method `[]' for nil:NilClass
    from /Users/tomb/Projects/schoolsparrow/app/controllers/searches_controller.rb:21:in `show'
>> 

results.last.present?results.last时,如何通过nil来使逻辑迷茫。

3 个答案:

答案 0 :(得分:1)

如果要测试数组中是否包含任何值,请尝试:

@results.any?

一个空数组不是nil,这就是检查失败的原因。

编辑:

A concise explanation of nil v. empty v. blank in Ruby on Rails

答案 1 :(得分:0)

为什么不检查@results.present?而不是@results.last.present?上的状况。

@results.last如果NoMethodError@result会抛出nil

答案 2 :(得分:0)

要检查数组是否包含元素,请使用.any?或与其相对的双胞胎.empty?

irb(main):006:0> [].empty?
=> true
irb(main):007:0> [].any?
=> false

.present?.presence在数组上工作,但对于像params这样的哈希,它们在习惯上确实更正确。

def show
  @search = Search.find(params[:id])
  @results = @search.listings
  if @results.any? && ['p', 's', 'd'].include?(@results.last[0])
    p "@results.pop is either p, s, or d"
    @sort_column = @results.pop
    @grade = @sort_column.gsub(/[^0-9,.]/, "") unless @results.last[0] == "d"
  end
end