Modelo usando módulos de aplicación en Rails
-
04-10-2019 - |
Pregunta
Tengo un modelo que requiere la carga de datos externos desde una fuente auxiliar. Una serie de servicios web existe de que mi modelo puede recuperar los datos de (intercambiables), pero no quiero crear un código que hará que sea difícil cambiar los servicios (costes significativamente difieren en función de variable y fijo de uso y es probable que cambia será necesario).
Me gustaría crear un controlador para realizar la interacción (y luego crear nuevos controladores personalizados si el servicio requiere de conmutación). Por desgracia, debido a la estrecha conexión entre el controlador y el modelo, no tiene sentido para extraer el código en un plugin o joya. He extraído todo el código en un módulo (ver ejemplo), y en la actualidad tiene el código declarado por encima de mi modelo.
module Synchronize
def refresh
self.attributes = ...
self.save
end
end
class Data < ActiveRecord::Base
include Synchronize
end
¿El rieles (3.0.0) tienen una convención para almacenar módulos fuertemente acoplados con los modelos? Debería estar usando un plugin para hacer esto? Se asocia con este directorio 'app / ayudantes'? Si no es así, ¿dónde está el lugar más apropiado para almacenar el código? Gracias!
Solución
Tiene razón en que si el módulo está estrechamente unida a ese modelo específico, entonces no es un candidato bueno para una joya / plug-in.
app / helpers / es para los métodos de ayudante de vista y no debe contener módulos que son únicamente para mezclar en modelos.
Un lugar que usted puede poner el módulo está dentro lib /. Esto es para el código que en realidad no encajan dentro de cualquier lugar app / y es a menudo el hogar inicial de código de acoplamiento flexible antes de ser trasladado a un plugin (pero eso no es una regla dura y rápida). Sin embargo, desde su módulo está estrechamente unida a su modelo, lib / no puede ser el mejor lugar para ello.
Yo sé que 37signals (y otros) utilizan el concepto de '' preocupaciones como una forma de mantener el código del modelo relacionado organizada en módulos. Esto se implementa mediante la creación de aplicaciones / preocupaciones / y poniendo los módulos en ese país. A continuación se añade ese directorio a la ruta de carga de la aplicación en config / application.rb (config / environment.rb de raíles 2) con:
config.load_paths += %W(#{Rails.root}/app/concerns)
El módulo puede entonces ser mezclado 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.
Otros consejos
Este enlace me ha ayudado en todo esto.
http://ander.heroku.com/2010 / 12/14 / preocupaciones-in-carriles-3 /
he estado pegando en un directorio del modelo / extensiones. El sentido de las marcas de directorio preocupaciones, pero la palabra 'preocupación' no se siente obvio para mí. Tal vez va a crecer en mí.
I también agregó el camino extensiones en el application.rb
config.autoload_paths += %W(#{config.root}/app/models/extensions)