我有一个模块:
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?
答案 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)