rails formularios crear controlador concerns ruby-on-rails-3 mixins

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:

  1. ¿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/ ?
  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 amables señores.


  1. lib/ es un excelente lugar para módulos; mucho mejor que config/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 el vendor/plugins .

  2. Si lo pones en lib/ , necesitarás manualmente el archivo. 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 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.