我有一个观察者,它引发了一个错误:
def before_create(user)
raise "boom!"
end
现在,这将在控制台中出错:
> u = User.create!(:email => "test@test.com", :password => "test")
RuntimeError: boom!
/app/observers/user_observer.rb:3:in `before_create'
如果我点击重新加载,则错误仍然存在:
> u = User.create!(:email => "test@test.com", :password => "test")
RuntimeError: boom!
/app/observers/user_observer.rb:3:in `before_create'
但如果我退出并重新启动rails控制台,它就会消失。为什么?不应该重新加载这些观察者的变化吗?
答案 0 :(得分:3)
Rails控制台不会“重新加载”实例化对象。在调用boom!
后,您需要更改任何提升reload!
的对象的实例,以使更改生效。
更新(2)
这是第二次更新。希望这更清楚。
试试这个:
# app/models/User.rb
class User < ActiveRecord::Base
# before_validation :boom
def boom
raise 'boom!'
end
end
然后,在控制台中:
u = User.new
u.valid?
=> true
然后,像这样修改你的控制器以取消注释before_validation钩子:
# app/models/User.rb
class User < ActiveRecord::Base
before_validation :boom
def boom
raise 'boom!'
end
end
然后,在控制台中:
u.valid? # no crash!
=> true
u = User.new
u.valid? # no crash still!
=> true
reload!
u = User.new
u.valid? # crash!
RuntimeError: bang!
关键是您reload!
然后重新实例化您引用的任何用户模型。您还可以使用ActiveRecord查找器等从数据库中重新实例化模型。在这种情况下,您需要使用User.reset_column_information
重新加载列信息。
<强>参考强>