2011-01-07 3 views
3

Скажем, у меня есть некоторые пользовательские классы, которые не относятся к моделям, контроллерам и т. Д., Я должен поместить это в/lib правильно?Вопросы по загрузке Rails

In rails < 3 Я бы добавил этот каталог в мой loadpath и в rails 3+ я бы добавил это в свой autoload_path. Это верно?

Теперь скажите, что у меня есть классы, которые расширяют уже определенные классы. Где я должен положить это так, чтобы он запускался при запуске. Например, я хочу добавить метод 'foo' в String.

 
class String 
    def foo 
    'foo; 
    end 
end 

Куда я должен класть этот класс так, чтобы он был определен при запуске?

Еще одна странная ошибка, с которой я сталкиваюсь, когда я пытаюсь использовать классы пространства имен в lib.

 
module MyProject 
class Foo 
end 
end 

Теперь в консоли:

 
ruby-1.9.2-p136 :004 > MyProject::Foo 
LoadError: Expected /Users/me/workspace/my_project/lib/foo.rb to define Foo 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:492:in `load_missing_constant' 
from /Users/rob/.rvm/gems/ruby-1.9.2-p136/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:183:in `block in const_missing' 

я получаю эту ошибку. Как загрузить этот файл?

ответ

3

Вы можете вообще поместить файлы классов, где вы хотите, например, вы можете поместить их в приложение/других и добавить каталог в LOAD_PATH в Rails 2 или autoload_path в Rails 3.

Чтобы расширить уже определенные классы вы, вероятно, захотите поместить файлы в каталог config/initializers.

Чтобы исправить ошибку, вы указываете, что вы должны определить класс Foo в файле foo.rb и убедиться, что имена модулей совпадают (Bags and MyProject).

Причина, по которой имя было изменено на автозагрузку, это the classes in autoload_paths are actually getting autoloaded, not simply loaded. В этом разница между использованием «автозагрузки» и «требованием» в Ruby.

+0

Сумки на самом деле были опечаткой. Все еще получаю эту ошибку. Есть ли где-нибудь еще я могу поместить файлы, которые я хочу загрузить с помощью автозагрузки, как инициализаторы ?. Не уверен, почему Rails3 называет его автозагрузкой, когда он только автозагружается, если константа не определена – HelpMe

+0

Наряду с autoload_paths вы можете использовать autoload_once_paths, которые позволяют вам определять каталоги, которые будут загружаться только один раз при запуске Rails. Убедитесь, что между тестированием вы полностью перезагружаете консоль или приложение rails - даже если вы находитесь в разработке, поскольку пути инициализаторов и autoload_only_once будут загружаться только один раз - даже в процессе разработки. –

+0

Вещь, которая действительно запутывает, заключается в том, что «автозагрузка» на самом деле не загружает ничего. Он просто добавляет путь к классам. Все в конфигурациях/инициализаторах фактически загружается автоматически. Ie запускается при запуске. – HelpMe

8

В рельсах 3, путь автозагрузку отключен в конфигурации/application.rb

#config.autoload_paths += %W(#{config.root}/extras) 

Вы должны де-закомментировать эту строку, если вы хотите загрузить код из LIB реж.

Смежные вопросы