2010-10-15 7 views
27

Mam pewne zachowanie w moim kontrolerze, które wyciągnąłem do modułu, aby przetestować lepiej i ponownie użyć go w kilku miejscach. Dwa pytania na ten temat:Jak używać miksów lub modułów w kontrolerach w Rails 3?

  1. Gdzie jest dobre miejsce na umieszczenie moich modułów? Muszą działać, aby być dostępnym dla kontrolerów, więc myślałem o katalogu config/initializers/. Wydaje mi się to jednak trochę podejrzane. lib/?
  2. W jaki sposób zapewnić, że kod zostanie uruchomiony, aby moduły były dostępne w kontrolerach include?

Dziękuję uprzejmie panowie.

Odpowiedz

38
  1. lib/ to doskonałe miejsce na moduły; znacznie lepiej niż config/initializers/ - przynajmniej w mojej opinii. Jeśli jest kilka modułów lub jeden duży, możesz także rozważyć utworzenie wtyczki i umieszczenie jej w vendor/plugins.

  2. Jeśli umieścisz go w lib/, musisz ręcznie wpisać require plik. Railsy domyślnie nie ładują automatycznie plików w katalogu lib/. Możesz umieścić wymaganie w jednym z plików konfiguracyjnych.

Zwykle umieszczam moje dodatkowe autoloady w config/application.rb. Coś takiego powinno wystarczyć (zakładając, że plik .rb jest w katalogu o nazwie lib/my_module):

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

Musisz upewnić się, że moduł jest rzeczywista module a nie class. Następnie można po prostu umieścić go:

# 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

Spróbuj umieścić moduły określony kontroler w app/controllers. Wymagane jest no require.

+10

O ile nie są kontrolerami, nie powinny wchodzić w "aplikacjach/kontrolerach". To pokonuje cel struktury katalogów. – jergason

+0

Zgoda, rozwiązanie Arbind Thakur jest najlepsze. Nie jestem fanem/lib, ponieważ w dużych projektach, które z pewnością mogą stać się nieporęczne. app/mixins z hierarchią pod spodem jest tym, co najprawdopodobniej zrobimy. – jwg2s

1

1) Chciałbym umieścić: moja klasa extentions pod app/rozserzenia moje moduły w/app/wstawek swoje usługi w/aplikacji/usług

2) można skonfigurować aplikację, aby załadować wszystkie te w config/environment.rb: extentions klasy należy wymagać właściwy sposób i wstawek i usługi mogą być dodawane do ścieżki 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', '{**}')] 

(używam szyny 3)