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

Zec*_*eck 22 ruby ruby-on-rails ruby-on-rails-3

我是铁杆新手.我在lib目录中有一个设置,如下所示:

lib/
   blog/
     core/
        search/
            base.rb
Run Code Online (Sandbox Code Playgroud)

base.rb也定义了Base类:

module Blog
  module Core
    module Search
      class Base

        attr_accessor :properties

        def initialize(params)
          @properties = {}
        end
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我的application.rb中有以下代码

config.autoload_paths += Dir["#{config.root}/lib/**/"]
Run Code Online (Sandbox Code Playgroud)

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

LoadError in PostsController#index

Expected /home/usr/code/blog/lib/blog/core/search/base.rb to define Base
Run Code Online (Sandbox Code Playgroud)

任何的想法?我正在使用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)
Run Code Online (Sandbox Code Playgroud)

Waw*_*Loo 39

我有同样的问题.它来自于你尝试加载的事实/lib/blog/core/search/base.rb直接在application.rb中/lib/**/

我有错误:

Expected /[...]/myapp/lib/durative/base.rb to define Base (LoadError)
Run Code Online (Sandbox Code Playgroud)

目录结构:

lib/
 --durative/
   --base.rb
Run Code Online (Sandbox Code Playgroud)

base.rb:

module Durative
  class Base
    def initialize(config)
       @config = {}
    end
    #...
  end
end
Run Code Online (Sandbox Code Playgroud)

application.rb中:

config.autoload_paths += Dir["#{config.root}/lib/**/"]
Run Code Online (Sandbox Code Playgroud)

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

目录结构:

lib/
 --durative.rb **(added)**
 --durative/
   --base.rb
Run Code Online (Sandbox Code Playgroud)

durative.rb:

require 'durative/base'
Run Code Online (Sandbox Code Playgroud)

base.rb(无变化)

application.rb(已更改):

config.autoload_paths += Dir["#{config.root}/lib/"]
Run Code Online (Sandbox Code Playgroud)

告诉我们它是否也适合你.


Abd*_*bdo 7

我遇到过同样的问题.问题是因为我在不包括他们的父lib目录的情况下包含了子目录:

# did not work
config.autoload_paths += %W(#{config.root}/lib/foo)
Run Code Online (Sandbox Code Playgroud)

# in lib/foo/my_class.rb
module Foo
  class MyClass
  end
end
Run Code Online (Sandbox Code Playgroud)

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

将lib目录添加到config.autoload_paths可以解决问题

# worked
config.autoload_paths += %W(#{config.root}/lib #{config.root}/lib/foo)
Run Code Online (Sandbox Code Playgroud)