在这个上剥掉我的头发:
应用程序/模型/关切/ soft_delete.rb:
module SoftDelete
extend ActiveSupport::Concern
module ClassMethods
def testing_a_class
pp "Ima class method"
end
end
def testing_an_instance
pp "Ima instance method"
end
end
class User < ActiveRecord::Base
include SoftDelete
end
应用程序/模型/ user.rb:
class User < ActiveRecord::Base
testing_a_class
end
现在,在rails控制台中:
x = User.first # I expect "Ima class method" to be printed to the screen
NameError: undefined local variable or method `testing_a_class' for User(no database connection):Class
答案 0 :(得分:2)
我不知道你在哪里看到了将模块包含在定义它的同一文件中的想法,但你不能这样做(在rails中),因为rails的工作方式(自动延迟加载)。 / p>
Rails不会在启动时加载所有类。相反,当您引用一个尚不存在的类时,rails会尝试猜测它可能位于何处并从那里加载它。
x = User.first
在此行之前,常量User
不存在(假设之前未引用)。尝试解析此名称时,rails会在每个user.rb
中查找文件autoload_paths
(google up up)。它会在app/models/user.rb
找到一个。下次引用User
时,它将只使用此常量,并且不会在文件系统中查找它。
# app/models/user.rb:
class User < ActiveRecord::Base
testing_a_class
end
找到的定义只包含一些未知方法的调用(因此错误)。您的关注文件中的代码未加载,永远不会加载。要解决此问题,请在模型文件中包含问题。
# app/models/user.rb:
class User < ActiveRecord::Base
include SoftDelete
testing_a_class
end
现在应该可以了。