2013-03-08 73 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

相關問題