奇怪的零对象结果

时间:2011-02-24 12:57:22

标签: ruby-on-rails ruby

我有一个模块:

module Voteable
  def has_up_vote_of user
    return ! self.votes.select{|v| v.user.id == user.id && v.value == 1}.empty?
  end
  def has_down_vote_of user
    return ! self.votes.select{|v| v.user.id == user.id && v.value == -1}.empty?
  end
end

将其混合到模型中:

class Comment < ActiveRecord::Base
  include Voteable
end

在控制器代码中,有一个检查:

has_up_vote = @voteable.has_up_vote_of @user
has_down_vote = @voteable.has_down_vote_of @user

@voteable和@user是现有的模型项,可在DB中找到。

假设,可投票项目具有用户的上行投票权。执行代码后,has_up_vote将等于true, has_down_vote将为nil

为什么是nil,而不是false?

我使用了几种方法,但问题是一样的。即使这样也会产生同样的效果:

def has_up_vote_of user
  has = self.votes.select{|v| v.user.id == user.id && v.value == 1}.empty?
  return !has.nil? && has
end

可能,我误解了一些东西,但这种行为很奇怪

更新

我注意到了很奇怪的行为。

当我将方法改为琐碎时:

def has_up_vote_of user
  return false
end
def has_down_vote_of user
  return false
end

当我调试应用程序时,它们都返回nil。 但是,从控制台,它们返回false。

这是更多的赌注,因为我对这些结果无能为力。这些代码不起作用:

has_up_vote = false if has_up_vote.nil?
has_down_vote = false if has_down_vote.nil?

3 个答案:

答案 0 :(得分:1)

我认为您运行的调试环境会干扰has_down_votes的实际值。 select方法永远不应该按照定义返回nil

答案 1 :(得分:1)

而不是!{}。空?你可以使用{} .present?

它更具可读性,输出将始终为真/假

答案 2 :(得分:0)

我知道这不能解决你的奇怪问题的根本原因,但它应该给你想要的结果。而不是

return ! self.votes.select{|v| v.user.id == user.id && v.value == -1}.empty?

return !!self.votes.select{|v| v.user.id == user.id && v.value == -1}.any?

双重感叹号是有意的 - 它会导致nil变为false。 (!arr.empty?相当于arr.any?这相当于!! arr.any? - 除了最后一个将nil转换为false)