Где разместить файлы классов переопределения и как их настроить в проекте Rails 5? - PullRequest
0 голосов
/ 22 ноября 2018

Пересмотр вопроса (после и благодаря Гэвину Миллеру)

Если есть три вида расширений ядра (или патчи обезьян), как в следующих примерах:

1- a Builer Form

class FormWithBuilder < ActionView::Helpers::FormBuilder
  def object
    # ... my code
  end
end

2- расширение ядра класса

class Hash
  def translate_values
    th=Hash.new
    self.each{|k,v| th[k]=I18n.translate(v)}
    th
  end
end

3- Помощник по формам

module ActionView
  module Helpers
    module TranslationHelper

      alias_method :original_localize, :localize
      def localize(*args)
....
      end
     end
  end
end

куда мне поместить эти файлы?

После ответа Гэвина Миллера я понимаю, что должен использовать правильную структуру папок, как расширение ядра Rails и так далее.И не хавиги их под config/initializers, это было там, где я был раньше (и работал).Хорошо, давайте создадим папки и поместим их в lib /...

и с нетерпением ждем Я понял, что использование config.eager_load_paths и config.autoload_paths - плохая практика:

https://edgeguides.rubyonrails.org/autoloading_and_reloading_constants.html#autoload-paths-and-eager-load-paths

https://github.com/rails/rails/issues/13142

и рекомендует поместить всю эту папку lib/core_extensions, которую мне сказал Гэвин Миллер, в папку app/lib/ и ничего больше, кроме этойРешение не работает для меня, если я require все файлы, но это, как я понимаю, не нужно, потому что все внутри app загружается автоматически.

Я думаю, что мне не хватает какой-то конфигурации

Это на изображениях, проще объяснить

enter image description here

rails c

Running via Spring preloader in process 9724
Loading development environment (Rails 5.1.5)
2.4.0 :001 > Hash.new.translate_values
NoMethodError: undefined method `translate_values' for {}:Hash

после того, как требуется:

2.4.0 :015 > require Rails.root.join('app','lib','core_extensions','hash','localization.rb')
 => true 
2.4.0 :016 > Hash.new.translate_values
 => {} 

Спасибо

---- Отредактировано 27/10

IS это плохое решение?Просто создайте файл под config/initilizers/core_extensions.rb и

Dir.glob(Rails.root.join('lib/core_extensions/**/*.rb')).sort.each do |filename|
  require filename
end

таким образом, мне не нужно изменять ни config.autoload_paths, ни eager_load_paths

1 Ответ

0 голосов
/ 22 ноября 2018

То, что вы называете переопределением, называется базовым расширением (или патчем обезьяны) и попадает в папку с именем core_extensions.Таким образом, вместо большой группы различных функций в одном файле, вы можете разбить каждую часть функций на отдельные файлы. Проект Rails иллюстрирует, что я имею в виду в структуре папок.

Инициализаторы - это одно из мест, где их можно поместить, но я предпочитаю следовать соглашению Rails lib/core_extension/class_name/<file_name>.rb, поскольку их легчепроводите тесты, соблюдайте соглашение и, если возникнет такая необходимость, с легкостью извлекайте их в гем.

Глядя на ваши конкретные файлы, я бы сказал:

- lib
  - core_extensions
    - hash
      - localization.rb
    - action_view
      - helpers
        - translation_helper
          - localization.rb

The FormWithBuilder это не расширение ядра, а подкласс.lib - подходящее место для этого, но не объединяйте идею подклассов и расширений ядра, это две совершенно разные конструкции, которые служат совершенно разным целям.

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