RoutingError inattendue en essayant de faire un "sortable"

J’ai suivi la recipe pour faire un “sortable” en liste “drag-and-drop”
(très
scrupuleusement, mais en adaptant à mes besoins).

Voici la recipe :

Les seules différences majeures sont :

  • que mon contrôleur s’appelle EditionRubrique, et son action s’appelle
    ranger
  • que ce sont des Rubriques que j’essaye de ranger, par ordre de rang
  • que ma liste html s’appelle rubriques_liste

Ca devrait marcher selon le bouquin…
…mais ça ne marche pas dans mon appli.

En fouillant le log, je constate qu’une erreur comme celle-ci apparaît
dès
que j’essaye de drag-and-dropper dans ma liste :

Processing ApplicationController#index (for 127.0.0.1 at 2007-09-20
22:41:15) [P
OST]
Session ID: 021f38cc0b3c1be57a3272a45872369f
Parameters: {“rubriques_liste”=>[“1”, “2”, “3”, “4”]}

ActionController::RoutingError (no route found to match
“/edition_rubrique/range
r/#Rubrique:0xb70d5d38/#Rubrique:0xb70d5c48/#Rubrique:0xb70d5c20/#” with {:method=>:post})

Je vous passe les détails superflus de la trace de l’exception.

Si je comprend bien, il n’arrive pas à trouver le chemin à emprunter
pour
trouver l’action.

Ce que je ne comprend pas, c’est pourquoi, etant donné que l’adresse
commence bien par /edition_rubrique/ranger et que ça “colle” avec la
définition de mon contrôleur et de son action.

Quelqu’un a une idée de diagnostique (ou mieux, de médication) ?

Merci d’avance…


Michel B.

Bonjour,
A priori le message d’erreur c’est qu’il ne trouve pas le chemin avec
la méthode poste.
Tu peut transmettre ton bout de code du fichier de route ?
Tu utilise REST ?

Le 20 sept. 07 à 22:54, Michel B. a écrit :

Michel :
[…]

Les seules différences majeures sont :

  • que mon contrôleur s’appelle EditionRubrique, et son action s’appelle
    ranger
  • que ce sont des Rubriques que j’essaye de ranger, par ordre de rang
  • que ma liste html s’appelle rubriques_liste
    […]
    ActionController::RoutingError (no route found to match “/edition_rubrique/range
    r/#Rubrique:0xb70d5d38/#Rubrique:0xb70d5c48#Rubrique:0xb70d5c20/#” with {:method=>:post})

Je vous passe les détails superflus de la trace de l’exception.

Si je comprend bien, il n’arrive pas à trouver le chemin à emprunter pour
trouver l’action.

C’est normal, parce qu’aucune de tes routes ne correspond à
/edition_rubrique/:ga/:bu/:zo/:meu

Quelqu’un a une idée de diagnostique (ou mieux, de médication) ?

Diagnostic.

Tu n’as pas donné le code correspondant à ton sortable_element.

Je pense que tu t’es trompé au niveau de l’url :
:url => { :action => ‘ranger’, :id => @rubriques }

j’imagine ?

Supposons que j’ai un Chapitre qui a plusieurs Rubriques.
J’ai donc une liste de rubriques que je veux réordonner dans mon chapitre.

j’écrirai :
<% sortable_element ‘chapitre’, :url => { :action => ‘ranger’, :id =>
@chapitre }, :complete … %>

je passe un objet Chapitre (@chapitre), ListeRubriques en quelque sorte,
et non une liste d’objets Rubrique (une liste de rubriques).

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

REST je ne connais pas (en même temps, je suis peut-être comme mr
Jourdain,
à utiliser REST sans le savoir).

Pour le fichier de route, ça donne :

ActionController::Routing::Routes.draw do |map|

The priority is based upon order of creation: first created →

highest
priority.

Sample of regular route:

map.connect ‘products/:id’, :controller => ‘catalog’, :action =>

‘view’

Keep in mind you can assign values other than :controller and

:action

Sample of named route:

map.purchase ‘products/:id/purchase’, :controller => ‘catalog’,

:action
=> ‘purchase’

This route can be invoked with purchase_url(:id => product.id)

Installe le chemin par défaut vers le contrôleur d’accueil

map.connect ‘’, :controller => ‘accueil’

Installe les routes avec nom de fichier ou d’image.

map.connect ‘document/:action/:id/:nom.:extension’, :controller =>
‘document’

Allow downloading Web Service WSDL as a file with an extension

instead of a file named ‘wsdl’

map.connect ‘:controller/service.wsdl’, :action => ‘wsdl’

Install the default route as the lowest priority.

map.connect ‘:controller/:action/:id.:format’
map.connect ‘:controller/:action/:id’
end

Rien de bien extraordinaire je le crains (mais je l’ai déjà un peu
touché,
donc il est possible que j’ai commis une erreur sans m’en apercevoir).

Le 20/09/07, Guillaume BELLEGUIC [email protected] a écrit
:

…mais ça ne marche pas dans mon appli.


Michel B.

Effectivement mon url donne : :url => { :action => :ranger, :id =>
@rubriques }, mais ce que je veux c’est bien changer le rang de toutes
mes
rubriques à la fois, changer le rang d’une seule rubrique ça ferait des
doublons de rang et ce n’est pas ce que je souhaite.

Ceci dit je n’ai pas d’équivalent d’un objet Chapitre comme dans ton
exemple, les rubriques n’ont pas d’objet conteneur dans la couche
modèle.

S’il faut en faire un pour contourner le problème, soit, mais ça me
semble
une complication inutile (définir du modèle de données juste pour faire
plaisir à la vue et sans raison métier), et ca me semblerait bizarre
justement que personne n’ait jamais eu à ordonner une liste de premier
niveau (sans objet conteneur quoi).

Donc je vais essayer en créant un conteneur dans les objets métier ; si
toutefois quelqu’un a une idée pour contourner le problème sans ajouter
du
modèle de données ça m’intéresse.

Après essai, ça marche avec un objet conteneur.

Ceci dit, ce serait quand même mieux si on pouvait se passer de rajouter
un
objet à la couche métier juste pour assurer le retour d’informations de
la
vue au contrôleur…

Si quelqu’un a une idée / une info sur comment le faire, je suis Ã
l’écoute…

Si je comprend bien, je pourrais tout aussi bien faire quelque chose
dans le
goût :url => {:action => :ranger}, donc sans préciser d’id, et ma liste
sera
quand même envoyée et reçue dans params[:rubriques_liste] sans générer
de
RoutingException ?

J’essaye ça ce soir.

Merci pour les explications en tout cas, les exemples rails <=>
scriptaculous ne sont pas légions sur le net, et j’ai déjà eu beaucoup
de
mal pour trouver celui-ci à l’origine.

Michel :

Si je comprend bien, je pourrais tout aussi bien faire quelque chose
dans le goût :url => {:action => :ranger}, donc sans préciser d’id, et
ma liste sera quand même envoyée et reçue dans
params[:rubriques_liste] sans générer de RoutingException ?

Oui.

extrait de la doc de sortable_element :

By default, the action called gets the serialized sortable
element as parameters.

Example:
<%= sortable_element(“my_list”, :url => { :action => “order” })
%>

In the example, the action gets a “my_list” array parameter
containing the values of the ids of elements the sortable consists
of, in the current order.

extrait du tutoriel cité :

The grocery-list parameter is generated automatically by the
sortable_element() helper and creates an ordered of the list
items’ IDs.

De toute manière, tu ne peux pas, au moment où tu génères
le code html, indiquer la liste des ids car c’est l’usager, une
fois qu’il a reçu la page html et qui fait mumuse avec sa souris,
qui va l’arranger. Seul le JavaScript côté client/script.aculo.us
peut observer les modifs de l’usager et les renvoyer au serveur.
Toi tu te contentes d’indiquer à s.a.u le sous-arbre DOM à
observer. Et éventuellement lui demander de faire un numéro
de claquettes quand la requête Ajax s’est terminée.

J’essaye ça ce soir.

Merci pour les explications en tout cas, les exemples
rails <=> scriptaculous ne sont pas légions sur le net, et j’ai
déjà eu beaucoup de mal pour trouver celui-ci à l’origine.

si tu t’étais déjà exercé avec sortable_element (avec par exemple
une liste ul/li simple), tu aurais été plus familiarisé avec son
fonctionnement
et ç’aurait été plus facile de compliquer les choses ensuite avec
cette fois-ci un modèle AR::B.

C’est un peu comme lorsqu’on apprend à conduire et il
faut redémarrer à un stop à une intersection en T. Au début
c’est compliqué parce qu’il faut faire les contrôles visuels,
passer la première, accélérer, tourner le volant…

c’est plus facile si tu maîtrises l’arrêt/redémarrage en ligne
droite…

– Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)

Michel :

Effectivement mon url donne : :url => { :action => :ranger, :id =>
@rubriques }, mais ce que je veux c’est bien changer le rang de
toutes mes rubriques à la fois, changer le rang d’une seule rubrique
ça ferait des doublons de rang et ce n’est pas ce que je souhaite.

Ceci dit je n’ai pas d’équivalent d’un objet Chapitre comme dans ton
exemple,

Mon exemple, mon exemple… j’ai juste changé le nom de GroceryList
en Chapitre en suivant “scrupuleusement” le tutoriel.

les rubriques n’ont pas d’objet conteneur dans la couche modèle.

Ce qui est loin d’être une modification anodine quand on suit
très scrupuleusement un tutoriel.

S’il faut en faire un pour contourner le problème, soit, mais ça me
semble une complication inutile (définir du modèle de données
juste pour faire plaisir à la vue et sans raison métier),

C’est le tutoriel qui choisit ce type de conception et c’est
loin d’être bizarre même si ce n’est pas adapté à sa problématique.

et ca me semblerait bizarre justement que personne n’ait
jamais eu à ordonner une liste de premier niveau (sans
objet conteneur quoi).

Si on suit la logique du tutoriel, on a besoin de l’id de l’objet
conteneur pour générer l’url. C’est plus la génération de l’url
qui a besoin d’un id, que sortable_element qui en a besoin
d’un. sortable_element a besoin d’une url valide.

Après si dans ton cas, tu veux faire pointer vers /toto/tata
libre à toi.

La liste ordonnée est dans params[:rubriques_liste], donc
tu fais du traitement derrière, ça fait de la persistance ou non,
tu fais ce que tu veux… si ça te chante de jouer au scrabble avec,
tu peux le faire.

Donc si ta route ne requiert pas la présence d’un id, ben
tu ne lui en files pas et puis c’est tout.

Donc je vais essayer en créant un conteneur dans les objets
métier ; si toutefois quelqu’un a une idée pour contourner le
problème sans ajouter du modèle de données ça m’intéresse.

Dernière remarque : sortable_element (et prototype Sortable)
travaille sur des DOM ids et est indépendant d’ActiveRecord.

-- Jean-François.


Ruby ( http://www.rubyfrance.org ) on Rails ( http://www.railsfrance.org
)