irb / console重新加载!没有重新加载Rails观察者

时间:2012-08-07 22:00:53

标签: ruby-on-rails console reload observers

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

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

1 个答案:

答案 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重新加载列信息。

<强>参考