61 votes

Rails: moyen Élégant pour des modèles de structure dans des sous-dossiers sans créer de submodules

J'ai de nombreux modèles dans mon app/models dossier. Je voudrais nettoyer ce dossier jusqu'à un peu. Déplacement des modèles qui appartiennent les uns aux autres dans les sous-dossiers. Le problème est que par convention la classe du modèle est préfixée en un selon le module.

E. g.

app/models/blog/post.rb
app/models/blog/commentaire.rb
app/models/user.rb

de sorte que:

app/models/blog/post.rb

class Post < ActiveRecord
end

et pas

class Blog::Post < ActiveRecord
end

82voto

Ion Br. Points 1544

Voici ce que j'ai utilisé pour Rails 3:

config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**}')]

Cette configuration indique Rails afin d'analyser tous les app/models sous-dossiers de manière récursive et de charger tous trouvé des modèles. Pas de namespacing nécessaire.

12voto

Tilendor Points 9622

Nous avons besoin de le faire, et il y a une manière très simple.

déplacez vos modèles dans les sous-dossiers, et puis de dire des rails pour charger les fichiers de tous les sous-dossiers dans votre environnement.rb fichier:

config.load_paths += Dir["#{RAILS_ROOT}/app/models/*"].find_all { |f| File.stat(f).directory? }

Pas de namespacing nécessaire, et les modèles, peut être considéré comme normal dans votre application

4voto

pickwick Points 1122

J'ai également créé des sous-dossiers, puis a ajouté ce qui suit à l'application.rb fichier:

config.autoload_paths += Dir["#{config.root}/app/models/**/"]

Mais cela ne suffit pas lorsque les sous-dossiers sont nommées en utilisant le même nom qu'un modèle (par exemple, un dossier "utilisateur" contenant plusieurs fichiers, dont l'un est "l'utilisateur"). Ce fut l'origine de toutes sortes d'erreurs dans mon code jusqu'à ce que j'ai trouvé qu'il pourrait être résolu simplement en donnant les noms de dossiers qui sont différentes des modèles (par exemple, 'l'utilisateur des modèles) qu'elles contiennent. J'ai trouvé la suggestion à http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/, ce qui en fait des points pour cette question.

3voto

Aaron Gibralter Points 1751

J'ai donc l'habitude d'avoir dans les Rails 2 quelque chose comme ceci:

config.autoload_paths += Dir["#{config.root}/app/models/**/"]

Et les fichiers suivants:

  • app/models/user/base.rb: class User::Base
  • app/models/user/admin.rb: class User::Admin

Lorsque j'ai mis à Rails 3, j'ai continué à obtenir une erreur le long de ces lignes: Expected .../app/models/user/foo.rb to define Foo. De toute évidence, cela semblait fou depuis 2 Rails automatiquement supposer que ce que vous mettez dans de l'utilisateur/foo.rb serait User::Foo non seulement Foo.

Donc, la façon dont j'ai fini par résoudre ce était de se débarrasser de modèle de sous - autoload_paths et de faire quelque chose comme ceci:

J'ai créé app/models/user.rb:

module User
  autoload :User, 'user/base'
  autoload :User, 'user/admin'
end

1voto

Yaraher Points 2287

Vous pourriez peut-être regarder RailsEngines. Ce n'est pas exactement ce dont vous avez besoin, mais peut vous a donné quelques idées.

Autre que cela, si votre script semble fonctionner correctement (vous pourriez tout aussi bien lire tous les fichiers sur chaque sous-dossier sur le modèle, et exiger d'eux), je ne vois pas de problème par rapport à ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X