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でレール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

私も同じ問題を抱えていました。これは、 / lib / blog / core / search/base.rbをapplication.rbに直接ロードしようとしているという事実に由来しています。/lib/**/

私が持っていたエラー:

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/"]

それがあなたにもうまくいったかどうか教えてください。

于 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はMyClassを定義するためにExpectedを返します

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

また、確認すべきことの1つは、コントローラーに適切な名前が付けられていることです。

たとえば、posts_controller.rbが最初の行で次のようになっていることを確認してください

class PostsController < ApplicationController

コントローラーをコピーして、コントローラークラス名を変更しないように追跡したところ、間違いを犯しました。

于 2013-08-18T16:22:49.840 に答える
0

深く隠されたクラスがある場合は、次の方法でアクセスします。

Blog::Core::Search::Base.new 'foo'
于 2012-06-08T12:52:54.090 に答える
0

これに関する私のエラーは、私が持っていたということでした

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

私は自分のアプリを整理し続けようとしていて、名前空間を持っているときは、コントローラーを分割していました。残念ながら、Railsは2つの間をランダムにジャンプし、競合が発生してOPでエラーが発生するようです。

解決策:サブディレクトリの名前を変更し、ルートを調整します。

于 2013-09-20T21:46:00.103 に答える