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

Когда и где мне нужны файлы в приложении rails?

Скажем, у меня есть следующий файл в моем каталоге lib моего приложения rails:

#lib/proxy.rb
module SomeService
  class ServiceProxy
    def do_something
    end
  end
end

Если я хочу использовать ServiceProxy в модели, я могу использовать его так:

#app/models/product.rb
require 'proxy'

class Product < ActiveRecord::Base
  def do_something
    proxy = SomeService::ServiceProxy.new
    proxy.do_something
  end
end

Это работает, но я заметил, что если я хочу использовать ServiceProxy в другой модели, мне не нужно "требовать" прокси "во втором файле модели. Кажется, что" требует "прокси" " один раз в любой модели добавит его в путь поиска.

Может кто-нибудь объяснить это поведение и наилучшую практику, связанную с ним в приложении rails?

Спасибо!

UPDATE: Основываясь на приведенном ниже примере floyd, если мой файл ServiceProxy был сохранен как таковой,

#lib/some_service/service_proxy.rb

тогда мне не нужно явно требовать файл.

4b9b3361

Ответ 1

Это является полезным сообщением об этой проблеме.

Короче говоря, Rails автозагружает классы в вашем каталоге lib только в том случае, если они соответствуют соответствующим соглашениям об именах.

Ответ 2

Я бы вообще поставил эту инструкцию require в файле config/initalizer, например. config/initializers/load_proxy.rb

Ответ 3

Вы пытались удалить его с первой модели? Я верю, что Rails автоматически загрузит все файлы, которые у вас есть, в каталог lib, если вы не указали явно require.

Ответ 4

Также обратите внимание, что некоторые environment.rb поставляются с этими комментариями:

Rails::Initializer.run do |config|
  # Add additional load paths for your own custom dirs
  # config.load_paths += %W( #{RAILS_ROOT}/extras )
  config.load_paths << "#{RAILS_ROOT}/app/models/some_model_group"
  config.load_paths << "#{RAILS_ROOT}/lib"
end

Ответ 5

Rails автоматически добавит /lib /vendor /app этот каталог в путь автозагрузки. Когда вам нужны какие-то константы, вам потребуется конкретный файл. И вам не нужно требовать его во второй раз, потому что это было бы бесполезно.