Zeitwerk, require_dependency и разбиение классов Ruby на несколько файлов - PullRequest
1 голос
/ 23 октября 2019

До Rails 6 существовал простой способ разбить любой класс Ruby на несколько файлов, не вводя никаких дополнительных модулей или проблем. Это было очень полезно для тех классов Бога, которые оказались слишком большими, чтобы их можно было хранить в одном файле:

# god.rb
class God < ApplicationRecord
  require_dependency 'god~callbacks'
  require_dependency 'god~scopes'
  require_dependency 'god~search'
  require_dependency 'god~something_else'
  require_dependency 'god~and_more'
  require_dependency 'god~and_even_more'
  ...
end

# god~callbacks.rb
class God
  before_save :nullify_blanks
  before_save :nullify_unrelated_attrs
  ...
end

, и структура файла выглядела так:

models/
  god.rb
  god~callbacks.rb
  god~scopes.rb
  god~search.rb
  ...

И это прекрасно работает - каждый раз, когда вы что-либо изменяете в любом из этих файлов, изменения корректно перезагружаются.

Начиная с Rails 6, используется новый загрузчик классов - Zeitwerk. И это здорово, но кажется, что он не работает с require_dependency, по крайней мере, когда этот метод используется таким нестандартным способом.

Таким образом, вопрос в том, возможно ли разделить определение классав несколько файлов и продолжайте автоматическую перезагрузку, работая с Zeitwerk. И цель состоит в том, чтобы разделить класс без введения каких-либо внутренних модулей / проблем.

И, пожалуйста, не нужно комментировать, является ли класс длиной в 1000 строк хорошей практикой проектирования или нет, вопрос не в этом.

1 Ответ

2 голосов
/ 23 октября 2019

Вы можете отказаться от использования Zeitwerk, установив config.autoload = :classic в своем файле application.rb. Если вы хотите продолжить использовать Zeitwerk, то почему бы не заменить вызовы require_dependency на include?

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