Ruby — NoMethodError (неопределенный метод для nil: NilClass):

У меня возникли некоторые трудности, пытаясь понять, что я делаю неправильно. Мой запрос ActiveRecord возвращает nil, что, я думаю, вызывает NoMethodError повышение.

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

@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. Любые идеи о том, что я делаю неправильно здесь?


person Dodinas    schedule 11.02.2014    source источник
comment
Я полагаю, это не подходящее место inform_user_empty для исключения: поскольку вы звонили self.inform_user_empty, это self nil?   -  person Малъ Скрылевъ    schedule 11.02.2014
comment
Я не совсем понимаю ваш комментарий, но функция inform_user_empty находится в application_controller.rb.   -  person Dodinas    schedule 11.02.2014
comment
Да, но ваша ошибка говорит: undefined method 'inform_user_empty' for nil:NilClass, другими словами, это приводит к вызову nil.inform_user_empty, но поскольку функция inform_user_empty находится в application_controller.rb. Этого не может быть. заменить inform_user_empty на self.inform_user_empty. вставьте p self раньше и повторите попытку   -  person Малъ Скрылевъ    schedule 11.02.2014
comment
Попробовать @ available_number.present?   -  person Thaha kp    schedule 11.02.2014


Ответы (2)


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

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

    if @available_number.empty?
       p self
       self.inform_user_empty
    

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

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

person Малъ Скрылевъ    schedule 11.02.2014

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

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

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

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

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

а затем выполните:

if @available_number == nil
   inform_user_empty
else
   do_my_other_function
end

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

person Rajesh Omanakuttan    schedule 11.02.2014