A mágica de carregar coisas automaticamente
Eu acho que a opção de controlar as pastas das quais o material de carregamento automático é realizado foi suficientemente abordada em outras respostas. No entanto, caso outra pessoa esteja tendo problemas com o carregamento de itens, apesar de os caminhos de carregamento automático terem sido modificados conforme necessário, essa resposta tenta explicar qual é a mágica por trás desse item de carregamento automático.
Portanto, quando se trata de carregar coisas de subdiretórios, há uma pegadinha ou uma convenção que você deve estar ciente. Às vezes, a magia Ruby / Rails (desta vez principalmente Rails) pode dificultar a compreensão de por que algo está acontecendo. Qualquer módulo declarado nos caminhos de carregamento automático será carregado apenas se o nome do módulo corresponder ao nome do diretório pai. Portanto, caso você tente colocar lib/my_stuff/bar.rb
algo como:
module Foo
class Bar
end
end
Não será carregado automaticamente. Então, novamente, se você mudar o nome do dir pai para foo
hospedagem, assim, o seu módulo no caminho: lib/foo/bar.rb
. Estará lá para você. Outra opção é nomear o arquivo que você deseja carregar automaticamente pelo nome do módulo. Obviamente, só pode haver um arquivo com esse nome. Caso você precise dividir suas coisas em muitos arquivos, é claro que você poderia usar esse arquivo para exigir outros arquivos, mas eu não recomendo, porque quando no modo de desenvolvimento e você modifica esses outros arquivos, o Rails não consegue automagicamente recarregue-os para você. Mas se você realmente deseja, pode ter um arquivo com o nome do módulo que especifica os arquivos reais necessários para usar o módulo. Então você pode ter dois arquivos: lib/my_stuff/bar.rb
e lib/my_stuff/foo.rb
sendo o primeiro o mesmo que acima e o último contendo uma única linha:require "bar"
e isso funcionaria da mesma forma.
PS Sinto-me compelido a acrescentar mais uma coisa importante. Ultimamente, sempre que eu quero ter algo no diretório lib que precisa ser carregado automaticamente, eu tendem a começar a pensar que se isso é algo que eu estou realmente desenvolvendo especificamente para este projeto (que geralmente é, pode ser que algum dia se transformar em um trecho de código "estático" usado em muitos projetos ou em um sub-módulo git, etc. nesse caso, ele definitivamente deve estar na pasta lib) e talvez seu lugar não esteja na pasta lib. Talvez deva estar em uma subpasta na pasta do aplicativo · Sinto que essa é a nova maneira de fazer trilhos. Obviamente, a mesma mágica está no trabalho, onde quer que você carregue automaticamente os caminhos em que coloca suas coisas, por isso é bom para essas coisas. Enfim, este é apenas o meu pensamento sobre o assunto. Você é livre para discordar. :)
ATUALIZAÇÃO: Sobre o tipo de mágica ..
Como severin apontou em seu comentário, o núcleo "mecanismo de carregamento automático de um módulo" certamente faz parte do Ruby, mas o material dos caminhos de carregamento automático não é. Você não precisa do Rails para fazerautoload :Foo, File.join(Rails.root, "lib", "my_stuff", "bar")
. E quando você tentaria fazer referência ao módulo Foo pela primeira vez, ele seria carregado para você. No entanto, o que o Rails faz é fornecer uma maneira de tentar carregar coisas automaticamente de pastas registradas e isso foi implementado de tal maneira que ele precisa assumir algo sobre as convenções de nomenclatura. Se não tivesse sido implementado dessa maneira, toda vez que você fizer referência a algo que não está carregado no momento, precisará passar por todos os arquivos em todas as pastas de carregamento automático e verificar se algum deles contém o que você estava tentando fazer referência. Por sua vez, isso derrotaria a idéia de carregamento automático e carregamento automático. No entanto, com essas convenções em vigor, é possível deduzir do módulo / classe sua tentativa de carregar onde isso pode ser definido e apenas carregá-lo.
app/lib
.