在after_save之后,ActiveRecord子级无法访问自身

时间:2019-10-18 20:46:56

标签: ruby-on-rails activerecord

我有当前代码

bfabry@18723-bfabry /t/foo> plk
ClojureScript 1.10.520
cljs.user=> (require '[cljsjs.js-yaml])
nil
cljs.user=> (js/jsyaml.safeLoad "app:\n  bar: baz\n")
#js {:app #js {:bar "baz"}}
cljs.user=>

在这里创建控制器:

class NotifyBar < ActiveRecord::Base
  belongs_to :user_instance
  after_save :update_notifications

  def update_notifications
    notifier = NotificationHandler::Notifier.new
    notifier.check_and_update_status(self.user_instance.id)
  end
end

但是,当after_save触发时,我得到了:

  

NotifyBarController#create中的NoMethodError   nil:NilClass的未定义方法'id'

如何可靠地传递belongs_to变量的ID?

2 个答案:

答案 0 :(得分:1)

您没有显示足够的代码来确定,但是看起来@user_instancenil的这一行:@notify_bar.user_instance= @user_instance,因此您需要将该关联设置为{{1} }。

如果不是,请说明如何在控制器中进行设置?

更新

新代码显示nil操作未调用回调,因此未设置create。即使已设置,它也会被设置为@user_instance实例,因此无论如何都不会与NotifyBar模型中的belongs_to :user_instance匹配。

答案 1 :(得分:0)

结果是,NotifyBar被我不知道的外部类(“帮助”类)调用。它正在调用update_notifications(就像调用after_save一样),但是当该类是新创建的并且尚未保存时。然后出现错误,因为预先保存,并非总是可以访问class变量。

所以,我想得出的结论是,如果ActiveRecord类的变量神秘地“消失”了,可能是因为ActiveRecord尚未保存,所以它们并不是最初创建的。 (第二点,如果您要使用帮助器类,让这些帮助器类在他们正在帮助的类中添加注释说明这些帮助器函数正在尝试提供帮助可能会有所帮助。)