我得到了經典'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協會回調已經失去了與用戶的關聯調用的方法內的任務模型建立一個新的任務對象通過用戶關聯。
您的'current_user'是否與'@ user'(您在控制檯中測試過的)相同。我認爲你的'current_user'沒有'agent'。 – codeit 2013-03-23 17:58:20
它是當前已通過身份驗證的用戶,它屬於:代理 – edralph 2013-03-23 18:07:44
什麼是您的身份驗證用戶的用戶ID,它會產生錯誤?一旦你獲得用戶ID。然後嘗試'User.find(id).agent'我認爲它是'nil'。 – codeit 2013-03-23 18:31:56