2010-10-15 6 views
27

J'ai un comportement dans mon contrôleur que j'ai retiré dans un module afin de mieux tester et de le réutiliser dans quelques endroits. Deux questions à ce sujet:Comment puis-je utiliser des mixins ou des modules dans mes contrôleurs dans Rails 3?

  1. Où est un bon endroit pour mettre mes modules? Ils ont besoin de fonctionner pour être disponibles pour les contrôleurs, donc je pensais au répertoire config/initializers/. Cela me semble un peu suspect. lib/?
  2. Comment puis-je m'assurer que le code est exécuté afin que les modules soient disponibles pour include dans mes contrôleurs?

Merci beaucoup.

Répondre

38
  1. lib/ est un excellent endroit pour les modules; beaucoup mieux que config/initializers/ - au moins à mon avis. Si c'est plusieurs modules, ou un grand, vous pouvez également envisager de faire un plugin et de le placer dans vendor/plugins. Si vous le mettez dans lib/, vous devrez manuellement require le fichier. Rails, par défaut, ne charge pas automatiquement les fichiers dans le répertoire lib/. Vous pouvez placer le require dans l'un de vos fichiers de configuration.

J'ai l'habitude de mettre mes autoload supplémentaires dans config/application.rb. Quelque chose comme ça devrait faire l'affaire (en supposant que votre fichier .rb est dans un répertoire appelé lib/my_module):

config.autoload_paths += Dir["#{Rails.root}/lib/my_module"] 

Vous devez vous assurer que votre module est une module réelle et non un class. Ensuite, vous pouvez simplement inclure:

# lib/my_module/foobar.rb 
module Foobar 
    def foobar 
    "Hello world!" 
    end 
end 

# app/models/my_model.rb 
class MyModel < ActiveRecord::Base 
    include Foobar 
end 

# rails console 
>> obj = MyModel.first 
=> #<MyModel id: 1, ...> 
>> obj.id 
=> 1 
>> obj.foobar 
=> "Hello world!" 
-1

Essayez de mettre des modules spécifiques du contrôleur dans app/controllers. N ° require requis.

+10

Sauf s'ils sont contrôleurs, ils ne devraient pas aller dans 'app/controllers'. Cela va à l'encontre de l'objectif de la structure de répertoire. – jergason

+0

D'accord, la solution d'Arbind Thakur est la meilleure. Je ne suis pas un fan du/lib parce que dans les grands projets qui pourraient certainement devenir lourd. app/mixins avec une hiérarchie en dessous est ce que nous ferons très probablement. – jwg2s

1

1) J'aime mettre: mes extentions de classe sous app/extentions mes modules sous/app/mixins mes services sous/app/services

2) Vous pouvez configurer votre application pour charger tous ceux-ci dans config/application.rb: extentions de classe devraient être nécessaires bonne façon et les mixins et services peuvent être ajoutés à votre chemin autoload

class Application < Rails::Application 
    # require class extentions right now 
    Dir[Rails.root.join('app', 'extentions', "*.rb")].each {|l| require l } 

    # Custom directories with classes and modules you want to be autoloadable. 
    config.autoload_paths += Dir[Rails.root.join('app', 'mixins', '{**}')] 
    config.autoload_paths += Dir[Rails.root.join('app', 'services', '{**}')] 

(j'utilise des rails 3)

Questions connexes