J'ai quelques méthodes de contrôleur que j'aimerais partager. Quelle est la meilleure pratique pour ce faire dans Ruby on rails? Devrais-je créer une classe abstraite que mes contrôleurs étendent ou devrais-je créer un module et l'ajouter à chaque contrôleur? Vous trouverez ci-dessous les méthodes de contrôleur que je souhaite partager:
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
À mon avis, les principes de conception OO normaux s'appliquent:
Maps
et accédez aux méthodes telles que: Maps::driving_directions
.class MapController < ApplicationController
) et placez-y le code partagé.Dans votre cas, les méthodes nécessitent un état (params
), le choix dépend donc de la relation logique entre les contrôleurs qui en ont besoin .
Également:
Je sais que cette question a été posée il y a 6 ans. Je veux juste souligner que dans Rails 4, il existe maintenant des problèmes de contrôleur qui constituent une solution plus prête à l'emploi.
Je pense en fait qu'un module est le meilleur moyen de partager du code entre les contrôleurs. Les aides sont utiles si vous souhaitez partager du code entre différentes vues. Les helpers sont essentiellement des modules glorifiés. Par conséquent, si vous n'avez pas besoin d'un accès au niveau de la visualisation, je vous suggère de placer un module dans votre dossier lib.
Une fois le module créé, vous devez utiliser l'instruction include pour l'inclure dans les contrôleurs souhaités.
si vous voulez partager des codes entre le contrôleur et les assistants, vous devriez alors essayer de créer un module dans la bibliothèque. Vous pouvez également utiliser @template et @controller pour accéder à la méthode dans le contrôleur et l’assistant . Consultez cette option pour plus de détails http://www.shanison.com/?p=305
Je suis d'accord avec l'approche du module. Créez un fichier Ruby distinct dans votre répertoire lib et placez le module dans le nouveau fichier.
La méthode la plus évidente consiste à ajouter les méthodes à votre ApplicationController, mais je suis certain que vous le savez déjà.
J'ai trouvé qu'un moyen efficace de partager un code identique sur plusieurs contrôleurs consiste à faire hériter un contrôleur de l'autre (où réside le code). J'ai utilisé cette approche pour partager des méthodes identiques définies dans mes contrôleurs avec un autre ensemble de contrôleurs nommés.
Une autre possibilité:
Si votre code commun nécessite un état et que vous souhaitez partager le comportement entre les contrôleurs, vous pouvez le placer dans une ancienne classe Ruby ordinaire dans votre répertoire model
ou lib
. N'oubliez pas que les classes model
ne doivent pas nécessairement être persistantes, même si toutes les classes ActiveRecord sont persistantes. En d’autres termes, il est acceptable d’avoir des classes transitoires model
.