2010-10-15 7 views
27

Tengo un comportamiento en mi controlador que saqué en un módulo para probar mejor y volver a utilizarlo en algunos lugares. Dos preguntas sobre esto:¿Cómo puedo usar mixins o módulos en mis controladores en Rails 3?

  1. ¿Dónde está un buen lugar para poner mis módulos? Necesitan ejecutarse para estar disponibles para los controladores, así que estaba pensando en el directorio config/initializers/. Eso parece un poco sospechoso para mí. lib/?
  2. ¿Cómo me aseguro de que el código se ejecute para que los módulos estén disponibles para include en mis controladores?

Gracias amablemente señores.

Respuesta

38
  1. lib/ es un excelente lugar para los módulos; mucho mejor que config/initializers/ --al menos en mi opinión. Si se trata de varios módulos, o uno grande, también puede considerar convertirlo en un complemento y colocarlo en vendor/plugins.

  2. Si lo pone en lib/, necesitará manualmente el archivo require. Rails, de forma predeterminada, no carga automáticamente los archivos en el directorio lib/. Puede colocar el requerimiento en uno de sus archivos de configuración.

Normalmente pongo mis autocargadores adicionales en config/application.rb. Algo como esto debe hacer el truco (suponiendo que el archivo de .rb está en un directorio llamado lib/my_module):

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

Usted tiene que asegurarse de que su módulo es un real y no un moduleclass. A continuación, sólo tiene que incluirlo:

# 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

trate de poner los módulos específicos del controlador en app/controllers. No se requiere require.

+10

A menos que sean controladores, no deberían entrar en 'app/controllers'. Eso frustra el propósito de la estructura del directorio. – jergason

+0

De acuerdo, la solución de Arbind Thakur es la mejor. No soy fanático de/lib porque en grandes proyectos definitivamente podría volverse difícil de manejar. La aplicación/mixins con una jerarquía debajo es lo que probablemente haremos. – jwg2s

1

1) me gusta poner: mis extensiones de clase bajo app/extensiones mis módulos en/app/mixins mis servicios bajo/app/servicios

2) Puede configurar la aplicación para cargar todos éstos en config/application.rb: extensiones de clase debe exigir manera correcta y los mixins y servicios se pueden agregar a su trayectoria de carga automática

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', '{**}')] 

(estoy usando los carriles 3)

Cuestiones relacionadas