Когда и где мне требуются файлы в приложении rails? - PullRequest
27 голосов
/ 23 января 2010

Допустим, у меня есть следующий файл в каталоге 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 в другой модели, мне не нужно "требовать" прокси "во втором файле модели. Кажется, наличие «require 'proxy» один раз в любой модели добавит его в путь поиска.

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

Спасибо!

UPDATE: Исходя из ответа Флойда, приведенного ниже, если мой файл ServiceProxy был сохранен,

#lib/some_service/service_proxy.rb

тогда мне не нужно было бы явно запрашивать файл.

Ответы [ 5 ]

14 голосов
/ 23 января 2010

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

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

4 голосов
/ 23 января 2010

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

1 голос
/ 23 января 2010

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

0 голосов
/ 21 мая 2014

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

0 голосов
/ 23 января 2010

Также обратите внимание, что некоторые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...