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 : "<p>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 : <code> stringOutput = "" Element.each do |elem| if elem.content == "#module_produit" stringOutput = LE RENDU D'UN CONTROLLER ! else stringOutput = elem.content end </code> 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 ?
on 20.02.2008 19:17
on 10.03.2008 13:47
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...
on 10.03.2008 14:16
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
on 10.03.2008 14:38
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.
on 10.03.2008 14:46
>> 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
on 10.03.2008 14:51
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 Friofool a écrit :
on 10.03.2008 16:04
>> 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
on 10.03.2008 16:20
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...
on 10.03.2008 16:59
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 :-) -- Web development is coming of age with Ruby on Rails blog.lachaise.org