Предполагается определить. При вызове класса внутри модуля
Я новичок в рельсах. У меня есть установка в каталоге 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)
Ответы
Ответ 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)
Ответ 3
Просто добавьте:
require base.rb
в файле environment.rb.
Источник:
http://icebergist.com/posts/expected-xrb-to-define-x-loaderror
Ответ 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.
Решение:
Переименуйте свой подкаталог и настройте любые маршруты.