1

我在 SitesController#index undefined method `subdomain' for nil:NilClass 中得到 NoMethodError

我有一个 Accounts 表,其中有一个“子域”字段和一个 Site 模型,它是 Account Model 的子类,即:

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

结尾

我还将 current_account 方法更改为此但得到了同样的错误:

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

在上述任何一种情况下,我都会在 SitesController#index 上得到 nil:NilClass 错误的未定义方法“子域”。在尝试访问 url 时如下所示:

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”和一个初始化方法,但似乎没有任何效果。我还将帐户表字段从“子域”更改为“名称”,但没有成功。任何指南将不胜感激。

4

2 回答 2

1

我认为您可能会对 ApplicationController#current_account 中的“redirect_to”感到困惑。

此重定向不会立即发生,它会在其他所有内容完成后发生。因此,您的 current_account 方法仍会将 nil 返回到 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
于 2011-03-08T15:46:23.450 回答
0

你的问题是current_account零。确保将变量设置为有效(现有)对象实例。

于 2011-03-08T15:47:48.363 回答