2013-03-23 62 views
1

我得到了經典'Called id for nil...錯誤,但我很努力地看到爲什麼我的對象是零。before_add回調,'無對象的被調用ID'錯誤

當試圖抓取任務所屬代理的ID時,它在validate_assignee方法中出錯。

class Task < ActiveRecord::Base 

belongs_to :user 
has_one :agent, through: :users 
has_and_belongs_to_many :assignees, 
         class_name: "User", 
         before_add: :validate_assignee 
private 
    def validate_assignee(assignee) 
    #need to check that the :assignee belongs to the same :agent as the :user 
    #grab agent_id from self 
    current_agent_id = self.agent.id 
    #fails here on create of a Task through the @user.tasks.build association 
    ... 
    end 
end 

從控制檯我得到預期的行爲,當我通過

> task = @user.tasks.build ... 
> task.agent.id 
=> 1 

建立一個任務我創建的TasksController行動:

def create 
    @task = current_user.tasks.build(params[:task]) 
    ... 
end 

有什麼奇怪的,使用自此對象尚未保存時的上下文?有沒有更好的方法來做到這一點?我現在正處於這個階段,因爲我正在圍着圈子,因此我需要另一雙眼睛。謝謝。

更新: 爲了從過程消除current_user我已經改變了在創建行動明確地建立通過用戶相關聯的任務task.build,並與我知道屬於代理人的用戶。

@task = User.find(1).tasks.build(params[:task]) 

當我然後輸出validate_assignee方法這樣puts self.to_yaml我看到的是,工作不具有user_id組內的對象的表示。

因此,在總結 - 我在我的創建行動,但在由before_add協會回調已經失去了與用戶的關聯調用的方法內的任務模型建立一個新的任務對象通過用戶關聯。

+0

您的'current_user'是否與'@ user'(您在控制檯中測試過的)相同。我認爲你的'current_user'沒有'agent'。 – codeit 2013-03-23 17:58:20

+0

它是當前已通過身份驗證的用戶,它屬於:代理 – edralph 2013-03-23 18:07:44

+0

什麼是您的身份驗證用戶的用戶ID,它會產生錯誤?一旦你獲得用戶ID。然後嘗試'User.find(id).agent'我認爲它是'nil'。 – codeit 2013-03-23 18:31:56

回答

2

看來直到在保存記錄,您將無法訪問的相關屬性物體。那是什麼this chap says。相反,我添加了一個after_save回調到我的任務模型來調用我的驗證方法,其中一切都按預期工作。

當在驗證方法中通過self.to_yaml輸出任務時,我看到user_id值與預期的一樣。在我能夠驗證它之前,我必須實際保存記錄和habtm協會,這真是一種恥辱。

1

我覺得你沒有agent你的current_user。當你沒有agentuser

current_user.agent #=> nil 

所以,當nil通話id它拋出錯誤。

current_user.agent.id #=> Throws error 

如果您還沒有agent爲每user你可以使用try避免錯誤:

current_agent_id = self.agent.try(:id) 
+0

可悲的是,這不是每個用戶都有一個代理,每個新用戶都是通過代理關聯創建的,而不是通過User.create創建。我已經仔細檢查過,是這種情況。 – edralph 2013-03-23 20:08:37

+0

請參閱最新更新 - 任務在控制器中的創建操作和模型保存之間的某處處失去用戶關聯。 – edralph 2013-03-23 21:00:42