[Resolvido] Classes 'não-rails'

Tenho uma dúvida simples:
aonde seria o local adequado para colocar uma classe Foo que faria uma determinada ação, Service, seilá, qualquer classe. Dentro de app/* ou de lib/*?

Eu prefiro colocar em app, porque as classes são recarregadas sempre, em modo de desenvolvimento. Se colocar em lib vc precisa reiniciar o servidor.

Tudo bem @j0nny?
Vai de app/*. Por exemplo, se você quiser criar um diretório lib/logics/ (só um exemplo mesmo), manda bronca. Só dois detalhes:

  • para que as classes criadas em arquivos nesses diretórios estejam disponíveis da mesma forma que seus “models” em sua aplicação, será preciso configurar esse novo diretório como passível de ser “autoloadeado” pelo Rails:
  • esse mecanismo de autoload é “lazy”, então o Rails vai tentar carregar uma classe quando ele encontrar o nome da constante pela primeira vez. Se você tentar acessar a classe MinhaLogica dentro do seu código, o rails vai procurar no autoload_paths por um arquivo chamado minha_logica.rb. Se ele encontrar o arquivo mas a classe não for definida lá dentro, vai subir uma exception. Algo como: LoadError: Expected /.../lib/logics/minha_logica.rb to define MinhaLogica.

É algo assim que você está procurando?


Editado: arquivos em app/ são passíveis de autoload sem precisar de nenhuma configuração. Muito bem observado pelo @j0nny.

se fizer parte do seu domínio pode colocar em app/model mesmo. Se não eu coloco em lib.

[quote=ricardo.valeriano]Tudo bem @j0nny?
Vai de app/*. Por exemplo, se você quiser criar um diretório app/logics/ (só um exemplo mesmo), manda bronca. Só dois detalhes:

  • para que as classes criadas em arquivos nesses diretórios estejam disponíveis da mesma forma que seus “models” em sua aplicação, será preciso configurar esse novo diretório como passível de ser “autoloadeado” pelo Rails:
  • esse mecanismo de autoload é “lazy”, então o Rails vai tentar carregar uma classe quando ele encontrar o nome da constante pela primeira vez. Se você tentar acessar a classe MinhaLogica dentro do seu código, o rails vai procurar no autoload_paths por um arquivo chamado minha_logica.rb. Se ele encontrar o arquivo mas a classe não for definida lá dentro, vai subir uma exception. Algo como: LoadError: Expected /.../app/logics/minha_logica.rb to define MinhaLogica.

É algo assim que você está procurando?[/quote]

Exatamente isso :wink:
Mas no Rails 3.1, qualquer classe dentro de app/* vai ser carregado automaticamente, certo? Ao menos foi isso que percebi fazendo os testes agora :lol:

Tá coberto de razão @j0nny.

De qualquer forma, só de curiosidade (fiz uns testes aqui para confirmar), você pode inspecionar os caminhos no autoload:

$ rails console
> Rails.application.config.autoload_paths

ps.: vou editar o código do exemplo. Caso chegue alguém aqui no tópico dê de cara com algo que faz mais sentido.

[quote=ricardo.valeriano]Tá coberto de razão @j0nny.

De qualquer forma, só de curiosidade (fiz uns testes aqui para confirmar), você pode inspecionar os caminhos no autoload:

$ rails console
> Rails.application.config.autoload_paths

ps.: vou editar o código do exemplo. Caso chegue alguém aqui no tópico dê de cara com algo que faz mais sentido.[/quote]

Aqui no meu caso retornou um array vazio.

Tudo bem j0nny?

Então, ali você vai conseguir visualizar os paths configurados “por você”. Os caminhos padões são inferidos pelo Rails em outros cantos. Se você alterar a configuração lá no config/application.rb, aí vai fazer diferença nesse teste.

[quote=ricardo.valeriano]Tudo bem j0nny?

Então, ali você vai conseguir visualizar os paths configurados “por você”. Os caminhos padões são inferidos pelo Rails em outros cantos. Se você alterar a configuração lá no config/application.rb, aí vai fazer diferença nesse teste.[/quote]
Ah blza, vlw pelas explicações :wink: