Question sur les routes

Bon, une question parce que j’en ai assez de lutter avec les routes dès
que j’ajoute une action dans un controller existant.

Ca m’est arrivé plusieurs fois déjà . Dans un controller généré par un
scaffold, j’ajoute une action. Dans les routes, j’ajoute la ligne

map.connect ‘moncontroller/ma_nouvelle_action’, :controller =>
“moncontroller”, :action => “ma_nouvelle_action”

Si je relance le serveur et me rend Ã
localhost:3000/moncontroller/ma_nouvelle_action

Je tombe sur un message du type : Couldn’t find Moncontroller with
ID=ma_nouvelle_action

Dans les routes, au dessus des map.connects, il y a bien les
map.ressources. J’ai lu par ci par là que ça pouvait être le problème et
en effet, si je déplace mes map.connects au dessus des map.ressources,
ça marche tout de suite.

Pourtant, la fois précédente où je me suis débattue contre le problème,
j’ai apparemment trouvé (sans doute malgré moi) la solution puisqu’avec
une situation strictement similaire (controller issu d’un scaffold,
action ajouté, map.connect sous les map.ressources), ça marche.

Est-ce que quelqu’un pourrait m’expliquer ou me donner un lien qui
explique clairement d’où vient ce phénomène et comment le gérer ? (Non,
la doc officielle ne m’a pas éclairé sur le problème…)

PS : rakes routes affiche le même genre de chemins pour mon map.connect
ancien qui fonctionne et pour le nouveau qui ne fonctionne pas…

En fait il faut que tu apprennes comment marche ce truc limpide qu’est
le “restful” routes et là tu comprendras tout.

Explication de ton problème:

map.resources :moncontroller

ajoute automatiquement 7 routes, l’une d’elle connecte
MonController#show à l’url /moncontroller/:id

Donc si tu places map.connect 'moncontroller/ma_nouvelle_action" en
dessous de map.resources, lorsque tu fais une requête
/moncontroller/ma_nouvelle_action et bien Rails croit que tu veux te
connecter à l’action show avec comme params[:id] = “ma_nouvelle_action”,
Rails ne peut pas deviner ce que tu veux faire d’autre que ce qui est
écrit dans routes.rb.

Résolution de ton problème:

Déjà à la base la régle c’est d’avoir au maximum 7 actions par
controller, qui sont les 7 actions restful définies par map.resources,
donc pose-toi d’abord la question de savoir si ajouter une action de
plus est intelligent.

Si vraiment il n’y a rien d’autres à faire et que tu dois ajouter une
action ‘batarde’ de plus à un controller alors exceptionellement tu peux
enfreindre la règle des 7 actions (en pratique ça arrive rarement et
traduit généralement une faute de conception), et tu peux le faire de
cette manière:

map.resources :moncontroller, :collection => {:ma_nouvelle_action =>
:get}

Évidemment il faut que tu adaptes le code posté ci-dessus à ton propre
cas.

Ou alors change l’url d’accès pour ne pas qu’elle se fasse intercepter
par l’action show:

map.connect ‘urlalternative/ma_nouvelle_action’, :controller =>
“moncontroller”, :action => “ma_nouvelle_action”

Voilà c’est difficile au départ, et une fois qu’on a compris le truc,
c’est tout bête et on rigole bien de voir ceux qui pédalent avec
wordpress sur comment faire de l’url rewriting avec Apache, parce qu’en
fait c’est de ça qu’il s’agit ici et Rails fait ça tout seul comme un
grand.


http://digiprof.tv

Dernière remarque, c’est quoi ce “moncontroller” en réalité?

Fais super gaffe aux noms singuliers/pluriels! Sinon les routes vont
être ton pire cauchemar.

Perso, je nomme tous mes controller au pluriel, et ensuite dans
routes.rb je pluralise ou pas avec map.resource et map.resources, note
le “s” (ou pas) Ã la fin de resource.


http://digiprof.tv

Map.connect ne sert donc qu’Ã faire des routes arbitraires du genre
“/want/a/special/route/:id”, :controller => “uncontroller”, :action =>
“show” ?

Oui tout à fait.


http://digiprof.tv

Le controller au singulier est bien une faute d’inattention dans mon
post, tous mes controllers sont bien au pluriels.

Je connaissais bien l’explication que tu me donnes (les 7 routes crées
par map.ressources). Ma confusion vient du fait que pour un ancien
controller, tout fonctionne correctement en gardant le map.ressources
ordinaire et bien en dessous le map.connect pour la nouvelle action. Et
pour le nouveau d’hier, ça ne fonctionne pas. Alors que les deux
controllers et les deux actions sont très similiaires et ont été générés
de la même manière.

Cela dit, je ne connaissais pas :collection et :member pour
map.ressources et ça semble en effet plus approprié à mon problème.
Merci beaucoup.
Map.connect ne sert donc qu’Ã faire des routes arbitraires du genre
“/want/a/special/route/:id”, :controller => “uncontroller”, :action =>
“show” ?

Fernando P. wrote:

Map.connect ne sert donc qu’Ã faire des routes arbitraires du genre
“/want/a/special/route/:id”, :controller => “uncontroller”, :action =>
“show” ?

Oui tout à fait.


http://digiprof.tv

Noté, merci beaucoup !