预计定义。在模块内部调用类时

时间:2012-06-08 12:22:16

标签: ruby-on-rails ruby ruby-on-rails-3

我是铁杆新手。我在lib目录中有一个设置,如:

lib/
   blog/
     core/
        search/
            base.rb

base.rb也定义了Base类:

module Blog
  module Core
    module Search
      class Base

        attr_accessor :properties

        def initialize(params)
          @properties = {}
        end
      end
    end
  end
end

我的application.rb

中有以下代码
config.autoload_paths += Dir["#{config.root}/lib/**/"]

当我将其包含在帖子控制器中时,我会收到以下错误:

LoadError in PostsController#index

Expected /home/usr/code/blog/lib/blog/core/search/base.rb to define Base

有什么想法吗?我正在使用rails 3.2.5和RVM。谢谢你的一切建议。

更新:添加了我的完整堆栈:

Started GET "/admin/posts" for 127.0.0.1 at 2012-06-08 21:06:18 +0800

LoadError (Expected /home/usr/code/blog/lib/blog/core/search/base.rb to define Base):
  app/controllers/admin/base_controller.rb:5:in `<top (required)>'
  app/controllers/admin/posts_controller.rb:6:in `<top (required)>'


  Rendered /home/usr/.rvm/gems/ruby-1.9.3-p194@rails-3.2.5/gems/actionpack-3.2.5/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.9ms)
  Rendered /home/usr/.rvm/gems/ruby-1.9.3-p194@rails-3.2.5/gems/actionpack-3.2.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.6ms)
  Rendered /home/usr/.rvm/gems/ruby-1.9.3-p194@rails-3.2.5/gems/actionpack-3.2.5/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (7.0ms)

6 个答案:

答案 0 :(得分:39)

我遇到了同样的问题。它来自于您尝试使用/lib/**/ application.rb 中加载 /lib/blog/core/search/base.rb 这一事实>

我遇到错误:

Expected /[...]/myapp/lib/durative/base.rb to define Base (LoadError)

目录结构:

lib/
 --durative/
   --base.rb

<强> base.rb:

module Durative
  class Base
    def initialize(config)
       @config = {}
    end
    #...
  end
end

<强> application.rb中:

config.autoload_paths += Dir["#{config.root}/lib/**/"]

以下是我为使其发挥作用所做的更改

目录结构:

lib/
 --durative.rb **(added)**
 --durative/
   --base.rb

<强> durative.rb:

require 'durative/base'

base.rb (无变化)

application.rb(已更改):

config.autoload_paths += Dir["#{config.root}/lib/"]

告诉我们它是否适合您。

答案 1 :(得分:7)

我有同样的问题。问题是因为我包括子目录而不包括他们的父lib目录:

# did not work
config.autoload_paths += %W(#{config.root}/lib/foo)

# in lib/foo/my_class.rb
module Foo
  class MyClass
  end
end

Foo :: MyClass将返回Expected以定义MyClass

将lib目录添加到config.autoload_paths可修复问题

# worked
config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/foo)

答案 2 :(得分:3)

添加: require base.rb 在您的environment.rb文件中。

源: http://icebergist.com/posts/expected-xrb-to-define-x-loaderror

答案 3 :(得分:1)

另外,要检查的一件事是你的控制器是否正确命名。

例如,确保你的posts_controller.rb在第一行看起来像这样

class PostsController < ApplicationController

我在复制控制器并将其跟踪到不更改控制器类名称

时出错

答案 4 :(得分:0)

如果您有深度隐藏的课程,请以这种方式访问​​:

Blog::Core::Search::Base.new 'foo'

答案 5 :(得分:0)

我的错误是我有

app/
  controllers/
      projects/
          some_controller.rb
      projects_controller.rb

我试图保持我的应用程序井井有条,当有一个命名空间时 - 正在拆分控制器。不幸的是,看起来Rails会在两者之间随机跳转,并且会出现导致OP错误的冲突。

解决方案: 重命名子目录并调整任何路径。