2013-03-08 88 views
0

我不明白为什么我无法使用activerecord在我的模型中导航。Rails无法在具有活动记录的模型中导航

我有HAS_ONE轮廓(实际上是用户的详细信息)是belongs_to的用户和城市

class Profile < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :city 
end 

和模型市

class User < ActiveRecord::Base 
    has_one :profile, :dependent => :destroy 
end 

模型Profile能够HAS_MANY配置文件的用户模型

class City < ActiveRecord::Base 
    belongs_to :country 
    has_many :profiles 
end 

在我的user_controller中,我可以像这样访问配置文件:

@user = User.find(params[:id]) 
logger.info(@user.profile.inspect) 

但我不能去更深的是这样的:

@user = User.find(params[:id]) 
logger.info(@user.profile.city.inspect) 

返回

undefined method `city' for nil:NilClass 

我想要得到的是市从存储在配置文件中city_id名称模型。 有人可以向我解释我做错了什么吗? 感谢

+1

'@ user.profile.inspect'的结果是什么?我认为这是'无'。 – codeit 2013-03-08 18:20:38

+1

你能确认@user有个人资料吗?这些关系看起来都不错,但如果用户在数据库中实际上没有配置文件,那么你将会得到上述错误。 – 2013-03-08 18:21:14

+0

配置文件的city_id字段为空...无论如何,我仍然有一个错误:未定义的方法'城市'为#' – Gozup 2013-03-08 22:29:39

回答

2

那是因为你没有ProfileUser(即)@user.profile做的是nil。因此,您需要先为user创建profile,并执行@user.profile.city。它会工作。如果您认为profile可能是nil对于某些记录仍然想获得city对于有profile的记录,那么您可以使用try

@user.profile.try(:city) 
+0

Thanks codeit。配置文件存在,但字段city_id为空。我填充它,现在我有另一个错误:'未定义的方法'城市'为#<配置文件:0x00000003ef3870>'你知道它可能是什么? – Gozup 2013-03-08 22:31:03

+0

您在'Profile'模型中拥有'belongs_to:city'。 'profiles'表中的'city_id',对不对? – codeit 2013-03-09 02:56:59

+0

谢谢@codeit!有了“belongs_to:city”,它就可以工作。实际上,我在'Profile'模型中使用了多态关联,例如'belongs_to:profiler,:polymorphic => true',但我不知道需要在'profiles'表中设置特定的字段才能使其工作。我这样做是因为我的'Profile'模型belongs_to:city,:job,:shape等等。所以我想在父模型中的'Profile'和'has_many:profiles,:as =>:profiler'中声明一个多态关联。但是,你能解释一下''profile._''和't.string:profiler_type'存储在'profiles'表中吗?谢谢 – Gozup 2013-03-09 11:19:09

相关问题