2014-02-11 8 views
4

У меня возникли трудности с попыткой выяснить, что я делаю неправильно. Мой запрос ActiveRecord возвращает nil, который, как мне кажется, вызывает NoMethodError.Ruby - NoMethodError (undefined method for nil: NilClass):

Вот что у меня есть:

@number_exclude_list = ["1234567890", "2223334545"] 
@available_number = UserNumber.where.not(:user_num => @number_exclude_list) 

Который возвращает пустой набор строк:

=> #<ActiveRecord::Relation []> 

так, то у меня есть:

if (@available_number.empty?) 
    inform_user_empty 
else 
    do_my_other_function 

Но, я получаю:

`NoMethodError (undefined method 'inform_user_empty' for nil:NilClass)` 

Я пробовал: @available_number.blank? и `@available_number.nil?

И я все еще получаю ту же NoMethodError. Любые идеи о том, что я делаю неправильно здесь?

+0

Я считаю, что это неправильное место 'inform_user_empty' для исключения: потому что вы вызвали' self.inform_user_empty', это 'self'' nil'? –

+0

Я не совсем понимаю ваш комментарий, но функция 'inform_user_empty' находится в' application_controller.rb'. – Dodinas

+1

Да, но ваша ошибка говорит: 'undefined method 'inform_user_empty' для nil: NilClass', другими словами, это приводит к вызову' nil.inform_user_empty', но поскольку функция 'inform_user_empty' находится в' application_controller.rb'. Этого не может быть. замените 'inform_user_empty' на' self.inform_user_empty'. сначала вставьте 'p self' и повторите попытку –

ответ

1

Пожалуйста, запустите строку ниже в консоли:

@available_number = UserNumber.where.not(:user_num => @number_exclude_list) 

он возвращает ArgumentError: wrong number of arguments (0 for 1+), так как это не так, чтобы проверить состояние NOT IN в Rails ActiveRecord.

Замените его:

User.where('user_num NOT IN (?)',@number_exclude_list) 

, а затем сделать:

if @available_number == nil 
    inform_user_empty 
else 
    do_my_other_function 
end 

Hoep что будет решить эту проблему. Пожалуйста, дайте мне знать, действительно ли это вам помогло.

2

Текст исключения NoMethodError (undefined method 'inform_user_empty' for nil:NilClass) говорит, что это был вызов метода экземпляра #inform_user_empty экземпляра nil class'es, а так nil не имеет метода экземпляра интерпретатор бросил это исключение. Я вижу две основные причины для этого:

  1. self переменная имеет ключевое значение nil, я считаю, не в причине, потому что вы делаете вызов из контроллера, как вы сказали ApplicationController. Для того, чтобы убедиться, что self не nil, изменить код следующему:

    if @available_number.empty? 
        p self 
        self.inform_user_empty 
    

    повторите действие, и посмотреть на результат.

  2. Исключение было выбрано из другого места. Таким образом, вы должны указать полный журнал трассировки в своем сообщении.

Смежные вопросы