Utiliser la methode d'un controller dans un autre controller

Salut,

Voilà mon problème.

Je recupere divers contenu d’une table element.
Le contenu renvoyé peut soit être du texte/html soit un mot clé
permettant à l’appli d’executer une autre action.

Exemple :

Contenu renvoyé par la table “element”.

Cas 1 :

ceci est un paragraphe”

La je renvoi le contenu texte.

Cas 2 :

#module_produit

La j’aimerai utiliser l’action d’un autre controller, “module_produit”
en l’occurence.

Le code pourrait ressembler à ça :

stringOutput = ""

Element.each do |elem|

if elem.content == “#module_produit
stringOutput = LE RENDU D’UN CONTROLLER !
else
stringOutput = elem.content
end

J’ai utilisé jusqu’à présent la méthode render_component qui fonctionne
trés bien pour ce genre de chose mais j’ai vu que son avenir était
compromis dans les prochaines versions de Rails.

Est ce que je peux utiliser un plugin dans ce cas ?
J’ai aussi utiliser une classe externe dans “lib”, mais je perds tout
l’environnement Rails,les render etc…

Bref, je sais pas comment faire…

Une idée ?

hum…toujours personne pour me mettre sur une piste ?
j’ai le sentiment que la solution est simple mais je sais pas comment
faire ça…

Appeler une méthode d’un controlleur à partir d’un autre controlleurs ma
parait un peu barbare (à supposer que ça ne plante pas).

N’est-ce pas plutôt qu’un simple “render :partial” répondrait à ton
besoin ?

Sinon on peut arriver “proprement” dans un autre controlleur via un
“redirect_to” si on doit vraiment passer dans le contexte d’un autre
controlleur.


Web development is coming of age with Ruby on Rails
blog.lachaise.org

il faudrait mettre le code “métier” dans le partial

Si c’est du code métier, sa vrai place est dans le modèle.
Il n’y a que le modèle qui connait les règles, controlleur et vues
doivent
se rendre le plus transparent possible de ce point de vue (c’est un
idéal
bien sûr, mais on s’évite des ennuis en tendant vers ça).


Web development is coming of age with Ruby on Rails
blog.lachaise.org

philippe lachaise wrote:

Appeler une méthode d’un controlleur à partir d’un autre controlleurs ma
parait un peu barbare (à supposer que ça ne plante pas).

N’est-ce pas plutôt qu’un simple “render :partial” répondrait à ton
besoin ?

Sinon on peut arriver “proprement” dans un autre controlleur via un
“redirect_to” si on doit vraiment passer dans le contexte d’un autre
controlleur.


Web development is coming of age with Ruby on Rails
blog.lachaise.org

oui l’utilisation d’un partial est une solution mais dans ce cas il
faudrait mettre le code “métier” dans le partial ce qui n’est pas le
but.

le controller qui sert d’aiguillage déclenche des actions en fonction de
mots clés correspondants a des minis-applications.

je ne souhaite pas faire de redirect car je perdrai l’url et une page
peut contenir plusieurs mini-applis.

ex :

url → monsite/galerie

La page galerie se compose de 2 mots clés correspondant à 2 applis
distinctes et autonome dans l’architecture.

Mot-clé 1 : galerie
Mot-clé 2 : abonnement_mailing

Mon controlleur boucle sur les mots-clés de cette page :

contentRetour = “”

motsCles.each do |mot_cle|

case mot_cle

when “galerie”
contentRetour += RENDU DE LA METHODE D’AFFICHAGE DU CONTROLEUR GALERIE

when “abonnement_mailing”
contentRetour += RENDU DE LA METHODE D’AFFICHAGE DU CONTROLEUR MAILING
end

end

RenderComponent fonctionne pas mal dans ce cas mais j’ai vu dans le
dernier bouquin Rails que ses performances était remises en question, et
abandonné dans les futures versions de Rails.

En fait je veux pouvoir faire en Rails ce que je faisais en php avec un
simple include.

Exécuter un bout de code indépendant du controlleur courant.

Si tu es obligé de faire ce genre de choses, c’est peut-être que tes
controleurs sont mal découpés, non ?

Quand on a des méthodes utilitaires, communes à plusieurs controleurs,
on peut les mettre dans un plugin ou alors dans un controleur dont
dérivent les controleurs qui y ont droit (liste non exhaustive je
suppose). Par exemple:

CommonController < ApplicationController
ControllerA < CommonController
ControllerB < CommonController

Et tu mets dans CommonController ce qui est commun entre tes
mini-applis.

N’hésitez pas si je dis une bêtise,


JB

Frioffol F. a écrit :

Quand on a des méthodes utilitaires, communes à plusieurs controleurs, on
peut les mettre dans un plugin ou alors dans un controleur dont dérivent
les
controleurs qui y ont droit

En allant par là on peut aussi les mettre dans un lib (si leur intérêt
ne
dépasse pas le cadre de l’appli en cours) et mettre le code dans un
module
qu’on mix-in dans le controlleur.


Web development is coming of age with Ruby on Rails
blog.lachaise.org

Je crois que tu as un problème de design d’application où tu essayes de
rentrer au chausse-pied dans Rails un approche qui relève peut être d’un
autre outil.

IMHO : laisse reposer 5mn, puis reprend à la base ton approche du MVC.
Ca
doit pas être méchant mais faut pas essayer de forcer là où ça passe
pas.

Bon courage. Zen :slight_smile:


Web development is coming of age with Ruby on Rails
blog.lachaise.org

en fait ce n’est que les méthodes d’autres controlleurs dont j’ai besoin
dans mon controlleur principal, mais aussi le rendu de ces méthodes.

Je vais détailler un peu plus :

ma bdd:

table PAGE :
id
nom

table ELEMENT :
id
page_id
content


mon controlleur principal :

CommonController < ApplicationController

def index

@contenuEnRetour = “”

pageCourante = Page.find_by_nom(params[:nomPage])

elementsDeCettePage = Element.find(:all,:conditions=>[“page_id =
?”,pageCourante.id]

elementsDeCettePage.each do |elem|

case elem.content

when “affiche_meteo”

@contenuEnRetour += “Executer la methode affiche_meteo du controlleur
meteo ainsi que son partial et affecter le retour a la variable
@contenuEnRetour

when “affiche_une_photo_de_ma_mere_en_string”

@contenuEnRetour += “Executer la methode ma_mere_en_string du
controlleur photo ainsi que son partial et affecter le retour a la
variable @contenuEnRetour

end #fin case/when

end #fin boucle contenu

end #fin methode index

end # fin common controlleur


la vue de mon controlleur, common_controlleur/index.rhtml

<%= @contenuEnRetour %>


le but etant de garder l’url de départ.

Ma regle au niveau du fichier de routes etant :

map.connect
‘/:nomPage’,:controller=>“common_controller”,:method=>“index”

Mon controlleur principal ne sert finalement qu’Ã executer les methodes
d’autres controlleurs et affecter leur résultat à une variable.

Je sais vraiment pas si je suis clair…je commence à m’embrouiller moi
même, en tout cas je n’arrive pas à faire ce que je veux et ça commence
à m’énerver…