1

我有一个观察者,它引发了一个错误:

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 控制台,它就会消失。为什么?不应该重新加载接受这些观察者的变化吗?

4

1 回答 1

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.

参考

于 2012-08-07T23:47:58.063 回答