Rails загружает вопросы пути - PullRequest
3 голосов
/ 07 января 2011

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

В rails <3 я бы добавил этот каталог в мой путь загрузки, а в rails 3+ я бы добавил это в мой autoload_path. Это правильно? </p>

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

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'

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

Ответы [ 2 ]

8 голосов
/ 07 января 2011

В rails 3 путь автозагрузки отключен в config / application.rb

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

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

3 голосов
/ 07 января 2011

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

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

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

Причина, по которой имя было изменено на автозагрузку, заключается в том, что классы в autoload_paths фактически загружаются, а не просто загружаются . В этом разница между использованием «autoload» и «require» в Ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...