繁体   English   中英

NoMethodError,未定义的方法“名称”,为nil:NilClass -rails 3

[英]NoMethodError, undefined method `name' for nil:NilClass -rails 3

我在nil:NilClass的SitesController#index未定义方法`subdomain'中收到NoMethodError

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

class Site < Account

end

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

结束

并且在application_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错误,我都会得到未定义的方法'subdomain'。 尝试访问网址时显示如下:

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

我认为您可能会对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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM