使用模型问题

时间:2014-04-15 13:08:29

标签: ruby-on-rails ruby

在这个上剥掉我的头发:

应用程序/模型/关切/ 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

1 个答案:

答案 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

现在应该可以了。