Объект Ruby rails равен нулю, но логика контроллера действует так, как будто объект не равен нулю - PullRequest
0 голосов
/ 24 октября 2018

У меня есть объект Search с методом listings, который возвращает массив хэшей, если есть результаты поиска, в противном случае он возвращает пустой массив.В случае, если есть какой-либо пустой массив, мне нужно пропустить некоторый код и перейти прямо к странице шоу.Я пробовал object.nil? object.empty? object.present? все с одинаковым результатом .... объект, который должен быть нулем, обрабатывается как ненулевой.

Код контроллера:

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.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Почему бы вам не проверить свое состояние на @results.present?, а не @results.last.present?.

@results.last выдаст NoMethodError, если @result равно nil

0 голосов
/ 25 октября 2018

Чтобы проверить, есть ли в массиве элементы, используйте .any? или его противоположную двойню .empty?:

irb(main):006:0> [].empty?
=> true
irb(main):007:0> [].any?
=> false

.present? и .presence работают с массивами, но они действительно более идиоматически верны для хэшейкак параметры.

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
0 голосов
/ 24 октября 2018

Если вы проверяете, есть ли в вашем массиве какие-либо значения, попробуйте:

@results.any?

Пустой массив не равен nil, поэтому ваши проверки не пройдены.

РЕДАКТИРОВАТЬ:

Краткое объяснение nil v. Empty v. Blank в Ruby on Rails

...