2010-11-07 43 views
0

我是一些在rails上使用ruby的新功能,所以我試圖調試我得到的這個錯誤,但是,從我的理解中,我正在使用prod代碼。在導軌上調試ruby錯誤

錯誤:

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,但他們會繼續爲零。問題是什麼?

回答

2

它可能是你的查詢不返回任何東西。您可以使用調試器,但只需輸出@current_brand並查看它的評估結果就相當簡單。

logger.debug(@current_brand) 
1

您必須檢查兩件事情:

  1. 滑軌是否正確構建SQL查詢與該方法的最後一行傳遞的網址是什麼?
  2. 記錄是否存在於品牌表中?你實際上並沒有檢查。

此外,傳遞這樣的URL會導致您面臨潛在的SQL注入攻擊。

0

你需要用rescue或if/else重寫你的定義,所以如果你得到一個nil元素,那麼它不會是一個致命的錯誤。

這是你的問題:

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

@current_brand沒有找到任何東西所以一定要找到的東西。

@current_brand = Brand.find(:first) 

如果這則解決了這個問題,你知道它是沒有找到任何東西,你就需要改變你的代碼,如果它返回nil那麼它不提供功能或找到一個默認的品牌比如什麼我建議。