2010-09-23 11 views
13

Tengo un modelo que requiere cargar datos externos desde una fuente auxiliar. Existe una cantidad de servicios web de los que mi modelo puede obtener los datos (intercambiables), pero no deseo crear un código que dificulte el cambio de servicios (los costos difieren significativamente en función del uso variable y fijo y es probable que cambie). será requerido).Modelo que usa módulos en la aplicación Rails

Me gustaría crear un controlador para realizar la interacción (y luego crear más controladores personalizados si el servicio requiere el cambio). Desafortunadamente, debido al estrecho acoplamiento del controlador y el modelo, no tiene sentido extraer el código en un complemento o gema. He extraído todo el código en un módulo (ver ejemplo), y actualmente tengo el código declarado sobre mi modelo.

module Synchronize 
    def refresh 
    self.attributes = ... 
    self.save 
    end 
end 

class Data < ActiveRecord::Base 
    include Synchronize 
end 

¿Tiene Rails (3.0.0) una convención para almacenar módulos estrechamente acoplados con los modelos? ¿Debo usar un complemento para hacer esto? ¿Está esto asociado con el directorio 'app/helpers'? Si no, ¿dónde está el lugar más apropiado para almacenar el código? ¡Gracias!

Respuesta

27

Tiene razón en que si el módulo está estrechamente acoplado a ese modelo específico, entonces no es un buen candidato para una gema/complemento.

app/helpers/es para ver los métodos de ayuda y no debe contener módulos que sean únicamente para mezclar en modelos.

Un lugar donde podría colocar el módulo está dentro de lib /. Esto es para un código que no se ajusta realmente a ninguna parte dentro de la aplicación/y suele ser el inicio de un código ligeramente acoplado antes de que se mueva a un complemento (pero esa no es una regla difícil y rápida). Sin embargo, dado que su módulo está estrechamente vinculado a su modelo, lib/puede no ser el mejor lugar para ello.

Sé que 37signals (y otros) utilizan el concepto de "preocupaciones" como una forma de mantener el código del modelo relacionado organizado en módulos. Esto se implementa creando aplicaciones/inquietudes/y colocando los módulos allí. Eso directorio se añade entonces a la ruta de la carga de la aplicación en config/application.rb (config/environment.rb para rieles 2) con:

config.load_paths += %W(#{Rails.root}/app/concerns) 

El módulo se puede mezclar en el modelo como normal.

Aquí está la entrada del blog original de este por Jamis Buck - http://weblog.jamisbuck.org/2007/1/17/concerns-in-activerecord

Otra variación de este que yo personalmente prefiero, aunque no se trate de módulos, utiliza este plugin: http://github.com/jakehow/concerned_with

Espero que ayude .

3

Este enlace me ha ayudado a superar esto.

http://ander.heroku.com/2010/12/14/concerns-in-rails-3/

he estado pegando en un directorio del modelo/extensiones. El directorio de inquietudes tiene sentido, pero la palabra "preocupaciones" no me parece obvia. Quizás crecerá en mí.

También he añadido la ruta de extensiones en el application.rb

config.autoload_paths += %W(#{config.root}/app/models/extensions) 
Cuestiones relacionadas