странный результат нулевого объекта - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть модуль:

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

@ voiceable и @user - это существующие элементы модели, найденные в БД.

Предположим, что элемент для голосования имеет право голоса пользователя.После выполнения кода has_up_vote будет равно true, а has_down_vote будет равно 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

Возможно, я что-то неправильно понимаю, но это странное поведение

Обновление

Iзаметил очень странное поведение.

Когда я изменяю методы на тривиальные:

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

Они оба возвращают ноль, когда я отлаживаю приложение.Но из консоли они возвращают false.

Это более странно, потому что я ничего не могу сделать с этими результатами.Этот код не работает:

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

Ответы [ 3 ]

1 голос
/ 24 февраля 2011

Вместо! {}. Пусто?Вы могли бы использовать {} .present?

Это более читабельно, и результат всегда будет истинным / ложным

1 голос
/ 24 февраля 2011

Я думаю, что среда отладки, в которой вы работаете, влияет на фактическое значение has_down_votes.Метод select никогда не должен возвращать nil, как определено.

0 голосов
/ 24 февраля 2011

Я знаю, что это не является основной причиной вашей странной проблемы, но она должна дать вам результаты, которые вы хотите.Вместо

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

try

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

Двойной восклицательный знак является намеренным - он приведет к тому, что nil станет false.(! arr.empty? эквивалентно arr.any?, что эквивалентно !! arr.any? - кроме того, что последний преобразует ноль в false)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...