我有一个对象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
来使逻辑迷茫。
答案 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