2010-11-07 4 views
0

Я немного новый с рубином на рельсах, поэтому я пытаюсь отладить эту ошибку, которую я получаю, но, по моему мнению, работает над кодом prod.отладка ruby ​​on rails error

Ошибка:

NoMethodError in JoinController#index 
undefined method `join_template' for nil:NilClass 
/app/controllers/join_controller.rb:5:in `index' 

Итак, строка 5 в индексе:

elsif current_brand.join_template == 'tms' 

Так ясно current_brand равна нулю. Контроллер класса ребенок AppController, так проверяя, что я вижу, что current_brand является метод:

def current_brand 
    return @current_brand if defined?(@current_brand) 
    url_array = request.env['HTTP_HOST'].split('.').reverse 
    url = url_array[1] << "." << url_array[0] 
    @current_brand = Brand.find(:first, :conditions => ["url LIKE ?", "%" << url << "%"]) 
    end 

Кажется, что @current_brand всегда возвращается, но он продолжает быть Nil. В чем проблема?

ответ

2

Возможно, ваш запрос ничего не возвращает. Вы можете использовать отладчик, но довольно просто вывести @current_brand и посмотреть, что он оценивает.

logger.debug(@current_brand) 
1

Вы должны проверить две вещи:

  1. делает Rails построить запрос SQL правильно с URL передается в последней строке этого метода?
  2. Имеется ли запись в таблице брендов? вы на самом деле не проверяете это.

Кроме того, прохождение в этом URL-адресе открывает вам потенциальную атаку SQL-инъекций.

0

Вам необходимо переписать определение с помощью аварийного восстановления или если/else, так что если вы получите элемент nil, то это не будет фатальной ошибкой.

Это ваша проблема:

@current_brand = Brand.find(:first, :conditions => ["url LIKE ?", "%" << url << "%"]) 

@current_brand не найдя ничего поэтому убедитесь, что вы нашли что-то.

@current_brand = Brand.find(:first) 

Если это устранит проблему, то вы знаете, что не находит ничего, и вам нужно будет изменить свой код, если он возвращает ноль, то он не обеспечивает функцию или он находит бренд по умолчанию, например, что Я предложил.