Подтвердить что ты не робот

Предполагается определить. При вызове класса внутри модуля

Я новичок в рельсах. У меня есть установка в каталоге 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

У меня есть следующий код в моем приложении .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

Любая идея? Я использую рельсы 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/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.9ms)
  Rendered /home/usr/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.6ms)
  Rendered /home/usr/.rvm/gems/[email protected]/gems/actionpack-3.2.5/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (7.0ms)
4b9b3361

Ответ 1

У меня была та же проблема. Это связано с тем, что вы пытаетесь загрузить /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/"]

Расскажите нам, если бы это сработало для вас.

Ответ 2

У меня была такая же проблема. Проблема заключалась в том, что я включал в себя поддиры без включения родительского lib dir:

# 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

добавление lib dir в config.autoload_paths устраняет проблему

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

Ответ 4

Кроме того, нужно проверить, что ваш контроллер назван соответствующим образом.

Например, убедитесь, что ваш posts_controller.rb выглядит так в первой строке

class PostsController < ApplicationController

Я допустил ошибки, когда я скопировал контроллер и отследил его, чтобы не изменять имя классов контроллера

Ответ 5

Если у вас есть этот глубоко скрытый класс, тогда обращайтесь к нему следующим образом:

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

Ответ 6

Моя ошибка в том, что у меня был

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

Я пытался удержать свое приложение и, имея пространство имен, разбивал контроллер. К сожалению, похоже, что Rails случайным образом перескочил между ними, и возникли бы конфликты, вызывающие ошибку в OP.

Решение: Переименуйте свой подкаталог и настройте любые маршруты.