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

Как требуются, требуют перезагрузки и константы, связанные с Rails?

Как require и require_dependency разные?
Как require_dependency автоматически перезагружать классы в разработке, но require не может?

Я выкопал код Rails ActiveSupport::Dependencies и dispatcher.rb. То, что я видел в коде require_dependency, в основном добавляет константы к массиву autoloaded_constants. Но после каждого запроса он очищается внутри clear_application внутри диспетчера.

Может кто-нибудь дать ясное объяснение или указать мне некоторые ресурсы, которые помогут?

4b9b3361

Ответ 1

require (и его кузен load) являются основными методами Ruby. require_dependency - это метод, который помогает Rails обрабатывать проблему управления зависимостями. Короче говоря, он позволяет Rails перезагружать классы в режиме разработки, так что вам не нужно перезапускать сервер при каждом изменении кода. Рамка Rails будет require_dependency вашего кода, чтобы она могла отслеживать и перезагружать ее при внесении изменений. Стандартный Ruby require не делает этого. Как разработчик приложения (или плагин/движок) вам не нужно беспокоиться о require_dependency, поскольку это чисто внутреннее Rails.

Магия процесса загрузки классов Rails находится в модуле ActiveSupport:: Dependencies. Этот код расширяет поведение Ruby по умолчанию, чтобы разрешить коду внутри вашего приложения Rails автоматически загружать модули (включая классы, которые наследуются от модуля), используя соглашения об именах путей и файлов Rails. Это устраняет необходимость того, чтобы программист помещал свой код в вызовы require, как в обычном приложении Ruby.

Другими словами, это позволяет определить class Admin::User внутри файла app/models/admin/user.rb и знать, что вы говорите, когда вы звоните Admin::User.new из другой части приложения, например контроллера. Без ActiveSupport:: Зависимости от вас потребуется вручную require все, что вам нужно.

Если вы исходите из статически типизированного языка, такого как С#, Java и т.д., то это может быть неожиданностью: код Rails не загружается до тех пор, пока он не понадобится. Например, класс модели User не определен и user.rb не загружается до тех пор, пока вы не попробуете позвонить User.whatever_method_here. Rails запрещает Ruby жаловаться на эту отсутствующую константу, загружает код для User, а затем позволяет Ruby продолжать как обычно.

Пока я не могу говорить о вашей конкретной необходимости, я был бы очень удивлен, если бы вам действительно понадобилось использовать метод require_dependency из плагина или движка. Если вы следуете соглашениям Rails, вам также не придется настраивать $LOAD_PATH вручную. Это не "путь Rails".

В мире Ruby и Rails простота и ясность являются ключевыми. Если все, что вы хотите сделать, это написать плагин или движок, и вы уже погружаетесь глубоко в внутренние части, тогда вы можете подумать о приближении своей проблемы под другим углом. Моя кишка говорит мне, что вы, возможно, пытаетесь сделать что-то ненужное. Но опять же, я не знаю, что вы делаете точно!:)

Ответ 2

require_dependency полезен в движке, если вы хотите повторно открыть класс, который не определен в вашем движке (например, в другом движке или приложении Rails) и перезагрузить его. В этом случае что-то вроде этого работает:

# app/controllers/my_engine/documents_controller.rb
require_dependency MyEngine::Engine.root.join('app', 'controllers', 'my_engine', 'documents_controller').to_s

module MyEngine
  class DocumentsController
    def show
      render :text => 'different'
    end
  end
end