![](/img/trans.png)
[英]Rails - NoMethodError - undefined method `name' for nil:NilClass
[英]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.