2011-03-08 108 views
1

我在SitesController#指數 未定義的方法`子域名越來越NoMethodError的零:NilClassNoMethodError,未定義的方法'名稱」的零:NilClass -rails 3

我有,有一個‘子域’的賬表場與Site模型是帳戶模型是的一個子類:

class Site < Account 

end 

create_table "accounts", :force => true do |t| 
    t.string "subdomain" 
    t.integer "user_id" 

並且在applications_controller定義這樣

一個current_account方法
def current_account 
    if !is_root_domain? 
    current_account = Account.find_by_subdomain(request.subdomains.first) 
    if current_account.nil? 
    redirect_to root_url(:account => false, :alert => "Unknown Account/subdomain") 
    end 
    else 
    current_account = nil 
end 
return current_account 

這就要求is_root_domain?下面的方法:

def is_root_domain? 
    result = (request.subdomains.first.present? && request.subdomains.first != "www") ? false : true 

我也chnaged的current_account方法這一點,但得到了同樣的錯誤:

def current_account 
    current_account = Account.find_by_subdomain(request.subdomains.first) 
end 

在上述任何情況下,我得到的未定義的方法`子域對於SitesController#index中的nil:NilClass錯誤。這顯示在下面試圖訪問的網址:

class SitesController < ApplicationController 
    def index 
    @site = Site.find_by_subdomain(current_account.subdomain) 
    end 

def opps 
    @site = Site.find_by_subdomain(current_account.subdomain) 
end 

我試圖爭奪沒有方法誤差的各種技巧,我知道的,比如增加「attr_ccessible」和initiliaze方法,但沒有似乎工作。我還將帳戶表字段從「子域」更改爲「名稱」,但沒有成功。任何指導將不勝感激。

回答

1

我想你可能會被ApplicationController#current_account中的'redirect_to'所困惑。

此重定向不會立即發生,它發生在所有其他操作完成時。因此,您的current_account方法仍然會返回零SitesController#index,它用於獲取「子域」,這就是您遇到錯誤的地方。

如果您從before_filter調用重定向,它可以在代碼甚至輸入您的#index方法之前處理這種情況。我會重構這樣的代碼。

class ApplicationController 

    # get the current account from the subdomain, calling find only if first time.. 
    def current_account 
    unless is_root_domain? 
     @current_account ||= Account.find_by_subdomain(request.subdomains.first) 
    end 
    @current_account 
    end 

end 

然後:

class SitesController < ApplicationController 
    before_filter :require_current_account 

    def index 
    @site = Site.find_by_subdomain(@current_account.subdomain) 
    end 

    private 
    # makes sure @current_account is setup before using it elsewhere.. 
    def require_current_account 
    if current_account.nil? 
     redirect_to root_url(:account => false), :alert => "Unknown Account/subdomain" 
    end 
    end 

end 
+0

@bhouse謝謝你的時間,nomethod錯誤消失了,所以你的代碼真的很有幫助。您是否知道爲什麼它會從redirect_to root_url中吐出錯誤消息,如下所示:已啓動GET「/?alert = Unknown + Account%2Fsubdomain」for 127.0.0.1 at 2月08日15 :54:05 +0000 2011 將SitesController#index處理爲HTML 參數:{「alert」=>「未知帳戶/子域」} 重定向到http://lvh.me:3000/?alert =未知+帳戶%2Fsubdomain 已完成302在0ms中找到 – brg 2011-03-08 16:03:14

+1

@brg它將警報添加爲查詢字符串,因爲 - 如果您的代碼是按照上面的代碼執行的,則您將它傳遞給root_url方法。嘗試將其改爲:'redirect_to root_url(:account => false),:alert =>「未知帳戶/子域名」'。正如你所看到的那樣,添加:account => false作爲查詢字符串,我認爲它是你想要的,但將alert傳遞給redirect_to。 – 2011-03-08 16:13:06

+0

@luke_randall,謝謝我現在就改變它。感謝您的停止和幫助。 – brg 2011-03-08 16:15:03

0

您的問題是current_account爲零。確保您將該變量設置爲有效(現有)對象實例。

+0

感謝您的建議。 – brg 2011-03-08 16:51:34

相關問題