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

Rails + Gems (в общем): Как работают драгоценные камни?

Я использовал Rails некоторое время и всегда использовал gems в своем gemfile, но я никогда не понимал, как функциональность самоцветов, которые я устанавливаю, становится доступной. Скажем, я использую gem has_permalinks (http://haspermalink.org/). Он предоставляет метод .generate_permalink! для моей модели. Где этот метод определяется? Почему просто я могу использовать этот метод внезапно, просто установив драгоценный камень? Есть ли какой-то include/require/load для инициализации кода драгоценного камня, чтобы он стал доступен для остальной части приложения? Кроме того, где этот код хранится при установке драгоценного камня?

4b9b3361

Ответ 1

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

Также, где этот код хранится при установке драгоценного камня?

Если вы используете Bundler, вы можете сделать bundle show has_permalink, и он покажет вам, где этот драгоценный камень установлен. Вот пример того, как я делаю это с камнем pg:

✗ bundle show pg
/Users/jasonswett/.rvm/gems/[email protected]/gems/pg-0.11.0

Где этот метод определяется?

Если вы выполняете bundle show вещь, она возвращает путь - метод определен где-то там. (Вы можете использовать grep -r 'def generate_permalink' /gem/path, чтобы найти именно там, где хотите.)

Почему просто я могу использовать этот метод внезапно, просто установив драгоценный камень? Существует ли какая-либо функция include/require/load для инициализации чтобы он стал доступным для остальной части приложение?

Посмотрите на эту часть документа о процессе инициализации Rails: http://guides.rubyonrails.org/initialization.html#config-boot-rb

В стандартном приложении Rails theres Gemfile, который объявляет все зависимостей приложения. config/boot.rb ENV [ "BUNDLE_GEMFILE" ] в местоположение этого файла, затем требуется Bundler и вызывает Bundler.setup, который добавляет зависимости (включая все части Rails) к пути загрузки, что делает они доступны для загрузки приложения.

Похоже, на раннем этапе Rails смотрит на ваш Gemfile и загружает все ваши драгоценные камни через Bundler. Так что там есть.