2011-02-24 73 views
0

我有一个模块:奇怪零对象结果

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是现有模型项目,可在数据库中找到。

假设,可供投票的项目有用户的赞成票。在执行代码之后,has_up_vote将等于true,并且has_down_vote将为零

为什么零,而不是假?

我已经使用了几种方法的变体,但问题是一样的。即使这给了我同样的效果:

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 

Posssible,我误解的东西,但这种行为很奇怪

更新

我发现很奇怪的行为。

当我改变方法简单:

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? 
+0

你得到的'self.votes.map {什么| V | [v.user.id,v.value]}'? – 2011-02-24 13:21:56

+0

我得到相同的结果(has_down_vote为零) – AntonAL 2011-02-24 13:30:19

+0

我要求你把'puts'语句,而不是替代'select'。 – 2011-02-24 13:32:07

回答

1

我认为你在运行调试环境与的has_down_votes实际值干扰。按照定义,select方法不应该返回nil

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? 

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

1

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

它的可读性更强,输出将永远是真/假只有