Rails 3: `require` внутри генератора - PullRequest
1 голос
/ 13 августа 2010

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

Итак, я создаю файл в папке генератора, а внутри файла генератора помещаю вверху:

require 'relative/path/to/my/code.rb'

Но когда я запускаю генератор, он говорит мне, что не может найти файл.

activesupport-3.0.0.rc/lib/active_support/dependencies.rb:219:in `require': no such file to load -- relative/path/to/my/code.rb (LoadError)

Кто-нибудь знает работу?

1 Ответ

2 голосов
/ 15 августа 2010

Зависит от того, какую версию Ruby вы используете.

В 1.8 он должен работать как вы. В 1.9 вы должны использовать require_relative.

Вы также не должны добавлять '.rb' в конце, это не рекомендуется.

Опасность простого 'require' с относительным путем состоит в том, что если этот сценарий сам по себе требуется другим, тогда путь будет относительно первого сценария с именем:

rootdir
  - main.rb
  - subdir1
    - second.rb
    - subdir11
      - third.rb

Если вызывается main.rb, а затем требуется second.rb (с 'subdir1/second'), а затем требуется третий.rb с 'subdir11/third.rb', он не будет работать.

Вы можете относиться к первому сценарию (subdir1/subdir11/third.rb), но это не очень хорошая идея. Вы можете использовать __FILE__, а затем сделать его абсолютным путем:

требуют File.expand_path ('../ subdir11 / third.rb', FILE )

(первый .. должен попасть в каталог, содержащий файл) или

требуется File.dirname ( FILE ) + '/subdir11/third.rb'

Но наиболее распространенная практика - ссылаться на нее из корневого каталога.

В геме вы можете предположить, что rootdir будет в $LOAD_PATH (или вы можете добавить его самостоятельно).

В Rails вы можете использовать require "#{RAILS_ROOT}/path" (rails2) или

require Rails.root.join('path') (rails3)

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