Ruby on rails 在添加回调之前&x27;为nil对象调用id';错误

Ruby on rails 在添加回调之前&x27;为nil对象调用id';错误,ruby-on-rails,Ruby On Rails,我得到了一个名为id for nil…的经典错误,但我很难理解为什么我的对象是nil 在尝试获取任务所属的代理的id时,validate\u submission方法会出错 class Task < ActiveRecord::Base belongs_to :user has_one :agent, through: :users has_and_belongs_to_many :assignees, class_name: "User",

我得到了一个名为id for nil…的经典错误,但我很难理解为什么我的对象是nil

在尝试获取任务所属的代理的id时,
validate\u submission
方法会出错

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
我在TasksController中的创建操作:

def create
  @task = current_user.tasks.build(params[:task])
  ...
end
当对象尚未保存时,在这种上下文中使用self是否有什么奇怪的地方?有更好的方法吗?我正处在这样一个阶段,我需要另一双眼睛来观察这个问题,因为我在绕圈子。谢谢

更新: 为了从流程中删除
当前用户
,我已更改了创建操作中的task.build,以通过用户关联显式生成任务,并使用我知道属于代理的用户

@task = User.find(1).tasks.build(params[:task])
然后,当我在
validate\u submission
方法中输出对象的表示时,像这样
将self.to\u yaml
放置,我看到任务没有设置
用户id


总之-我正在通过创建操作中的用户关联构建一个新任务对象,但在由before_add association回调调用的方法内的任务模型中,它已失去与用户的关联

我认为您没有为您的
当前用户
配备
代理。当您没有
用户的
代理时

   current_user.agent  #=> nil 
因此,当调用
id
on
nil
时,它会抛出错误

   current_user.agent.id #=> Throws error
如果您没有为每个
用户配备
代理
,您可以使用
尝试
以避免错误:

   current_agent_id = self.agent.try(:id)

在保存记录之前,您似乎无法访问对象的关联属性。就是这样。因此,我在我的任务模型中添加了一个
after_save
回调来调用我的验证方法,在这个方法中,一切都按预期进行


当通过验证方法中的
self.to_yaml
输出任务时,我看到了预期的
user\u id
值。很遗憾,我必须先保存记录和habtm关联,然后才能验证它。

您的
当前用户是否与
@user
相同(您在console中测试的内容)。我认为您的
当前\u用户
没有
代理
。它是当前经过身份验证的用户,它属于:agentWhat用户
id
,您的身份验证用户哪个创建了错误?一旦您获得了用户id。然后尝试
user.find(id).agent
我认为它是
nil
。快速问题:您是否为每个用户都创建了代理?是的,每个用户都是通过代理关联创建的,而不是通过调用用户创建的。很遗憾,这不是它-每个用户都有一个代理,每个新用户都是通过代理关联创建的,从不通过User.create。我已经仔细检查了这种情况。请查看最新更新-任务正在丢失控制器中的创建操作和模型保存时之间的用户关联。
   current_agent_id = self.agent.try(:id)