我有一个简单的课程:
class User
include Mongoid::Document
field :name
end
我想重新打开它以添加一个Mongoid回调:
class User
before_create :do_this
def do_this
# do it...
end
end
不幸的是我收到了错误:undefined method 'before_create' for User:Class
知道怎么做吗?我应该使用mixin模式而不是重新打开吗?
UPDATE :我无法更改原始类定义,因为它位于共享库中。加载顺序很棘手,因为它在Rails中。原始类位于autoload_path
中加载的文件中。我应该在哪里重新打开它?我宁愿使用模块而不是重新打开,但我不确定是否可以“从外部”包含我的模块!
更新2 :您说得对,这只是一个加载订单问题。所以现在我的问题变成了:由于Rails的自动加载是懒惰的,如何在加载原始类文件后强制Rails加载重新打开的文件? :)
答案 0 :(得分:1)
上面的代码在控制台中为我工作。我怀疑第一类声明是先加载的。您可以尝试在每个类声明中立即打印出一条消息,例如
class User
puts "First"
...
end
...
class User
puts "Second"
...
end
并验证它们是否以正确的顺序加载。
此外,如果您确实可以访问第一个类声明,则可以使用mixin,因为它可以将User类的所有内容保存在一个位置。
更新:您是否可以首先加载/要求共享的User类以确保它已加载?那就是:
require 'app/models/user'
class User
before_create :do_something
def do_something
...
end
end