ruby-on-rails-3 - crear - formularios en ruby on rails
¿Cómo puedo usar mixins o módulos en mis controladores en Rails 3? (3)
Tengo algún comportamiento en mi controlador que saqué en un módulo para probar mejor y reutilizarlo en algunos lugares. Dos preguntas sobre esto:
- ¿Dónde es un buen lugar para colocar mis módulos? Deben ejecutarse para estar disponibles para los controladores, por lo que estaba pensando en el directorio
config/initializers/
. Eso me parece un poco sospechoso.lib/
? - ¿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 amables señores.
lib/
es un excelente lugar para módulos; mucho mejor queconfig/initializers/
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 elvendor/plugins
.Si lo pones en
lib/
, necesitarás manualmente el archivo. Rails, de forma predeterminada, no carga automáticamente los archivos en el directoriolib/
. Puede colocar el requerimiento en uno de sus archivos de configuración.
Normalmente pongo mis cargas automáticas adicionales en config/application.rb
. Algo como esto debería hacer el truco (asumiendo que su archivo .rb
está en un directorio llamado lib/my_module
):
config.autoload_paths += Dir["#{Rails.root}/lib/my_module"]
Debe asegurarse de que su módulo sea un module
real y no una class
. Entonces, simplemente puede 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) Me gusta poner: mis extensiones de clase en aplicaciones / extensiones de mis módulos en / app / mixins mis servicios en / app / services
2) Puede configurar su aplicación para cargar todo esto en config / application.rb: las extensiones de clase deben ser requeridas de manera correcta y los mixins y servicios se pueden agregar a su ruta 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 rieles 3)
Trate de poner módulos específicos del controlador en la app/controllers
. No require
ningún requisito.