22

我是 Rails 新手。我在 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

任何想法?我正在使用带有 RVM 的 rails 3.2.5。谢谢你的每一个建议。

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

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)
4

6 回答 6

40

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

我遇到的错误:

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

目录结构:

lib/
 --durative/
   --base.rb

基础.rb:

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

应用程序.rb:

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

这是我为使其正常工作所做的更改

目录结构:

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

持续时间.rb:

require 'durative/base'

base.rb(没有变化)

application.rb(已更改):

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

告诉我们它是否也对您有用。

于 2012-06-12T16:43:23.083 回答
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)
于 2013-04-04T12:17:15.053 回答
3

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

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

于 2012-11-09T11:13:37.673 回答
1

此外,要检查的一件事是您的控制器名称是否正确。

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

class PostsController < ApplicationController

我在复制控制器并跟踪它以不更改控制器类名称时犯了错误

于 2013-08-18T16:22:49.840 回答
0

我的错误是我有

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

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

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

于 2013-09-20T21:46:00.103 回答
0

如果您有那个深深隐藏的类,请以这种方式访问​​它:

Blog::Core::Search::Base.new 'foo'
于 2012-06-08T12:52:54.090 回答