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!

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top