Tengo algunos métodos de control que me gustaría compartir. ¿Cuál es la mejor práctica para hacer esto en ruby on rails? ¿Debo crear una clase abstracta que amplíen mis controladores, o debo crear un módulo y agregarlo a cada controlador? A continuación se muestran los métodos del controlador que quiero compartir:
def driving_directions
@address_to = params[:address_to]
@address_from = params[:address_from]
@map_center = params[:map_center_start]
# if we were not given a center point to start our map on
# let's create one.
if !@map_center && @address_to
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_to).ll
elsif !@map_center && @address_from
@map_center = GeoKit::Geocoders::MultiGeocoder.geocode(@address_from).ll
end
end
def printer_friendly
starting_point = params[:starting_point].split(',').collect{|e|e.to_f}
ne = params[:ne].split(',').collect{|e|e.to_f}
sw = params[:sw].split(',').collect{|e|e.to_f}
size = params[:size].split(',').collect{|e|e.to_f}
address = params[:address]
@markers = retrieve_points(ne,sw,size,false)
@map = initialize_map([[sw[0],sw[1]],[ne[0],ne[1]]],[starting_point[0],starting_point[1]],false,@markers,true)
@address_string = address
end
ruby-on-rails
ruby
Kyle Boon
fuente
fuente
Respuestas:
En mi opinión, se aplican los principios normales de diseño de OO:
Maps
, y acceder a los métodos como:Maps::driving_directions
.class MapController < ApplicationController
) y coloque el código compartido allí.En su caso, los métodos necesitan state (
params
), por lo que la elección depende de la relación lógica entre los controladores que lo necesitan. Adicionalmente:También:
fuente
Sé que esta pregunta se hizo hace 6 años. Solo quiero señalar que en Rails 4, ahora hay problemas de controlador que son una solución más lista para usar.
fuente
De hecho, creo que un módulo es la mejor manera de compartir código entre controladores. Los ayudantes son buenos si desea compartir código entre vistas. Los ayudantes son básicamente módulos glorificados, por lo que si no necesita acceso a nivel de vista, le sugiero que coloque un módulo en su carpeta lib.
Una vez que cree el módulo, tendrá que usar la declaración de inclusión para incluirlo en los controladores deseados.
http://www.rubyist.net/~slagell/ruby/modules.html
fuente
Estoy de acuerdo con el enfoque del módulo. Cree un archivo Ruby separado en su directorio lib y coloque el módulo en el nuevo archivo.
La forma más obvia sería agregar los métodos a su ApplicationController, pero estoy seguro de que ya lo sabe.
fuente
Si desea compartir códigos entre el controlador y los ayudantes, debería intentar crear un módulo en la biblioteca. También puede usar @template y @controller para acceder al método en el controlador y el ayudante. Consulte esto para obtener más detalles http://www.shanison.com/?p=305
fuente
Otra posibilidad:
Si su código común necesita un estado y desea compartir el comportamiento entre los controladores, puede ponerlo en una vieja clase ruby en su directorio
model
olib
. Recuerde que lasmodel
clases no tienen que ser persistentes aunque todas las clases de ActiveRecord sean persistentes. En otras palabras, es aceptable tenermodel
clases transitorias .fuente
Descubrí que una forma efectiva de compartir código idéntico entre controladores es hacer que un controlador herede del otro (donde vive el código). Utilicé este enfoque para compartir métodos idénticos definidos en mis controladores con otro conjunto de controladores con espacio de nombres.
fuente