A propos du routage [2 questions de noob]

Bonjour,

Je ne comprends pas pourquoi cette route fonctionne : ‘/users/1/edit’,
alors que pourtant le fichier routes.rb contient ceci :

ActionController::Routing::Routes.draw do |map|
map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’
end

Normalement, d’après la configuration du routage, l’écriture correcte de
cette route devrait être : ‘/users/1/edit’
Bizarrement, en l’ayant testé, elle fonctionne aussi (et donne le même
résultat).

Voici par exemple ce que contient l’action ‘edit’ (générée
automatiquement par un échafaudage sur Rails 2) :

GET /users/1/edit

def edit
@user = User.find(params[:id])
end

Il y a aussi une autre chose que je ne comprends pas. J’ai ajouté dans
un contrôleur cette action :

def listing
@tags = Tag.find(:all)
end

En fait, elle est identique à l’action index. J’ai aussi crée une vue
listing.html.erb. Tout est donc normal il me semble, mais lorsque je
charge la page 0.0.0.0:3000/tags/listing, voici le message d’erreur qui
s’affiche :

ActiveRecord::RecordNotFound in TagsController#show
Couldn’t find Tag with ID=listing

Juste pour essayer, j’ai aussi essayé de charger la page
0.0.0.0:3000/tags/ et là , l’action index est exécuté. Mais si par contre
j’ajoute 0.0.0.0:3000/tags/index, j’ai aussi une erreur qui s’affiche :

ActiveRecord::RecordNotFound in TagsController#show
Couldn’t find Tag with ID=index

Je n’arrive pas à les expliquer, car Rails semble confondre action et
id, alors que mon fichier routes.rb est (je crois) bien configuré (par
défaut).

Merci pour vos lumières :slight_smile:

Zangief I. wrote:

Normalement, d’après la configuration du routage, l’écriture correcte de
cette route devrait être : ‘/users/1/edit’
Oops, je me suis trompé en écrivant trop vite, je voulais plutôt écrire
: ‘/users/edit/1’

Je ne comprends pas pourquoi cette route fonctionne : ‘/users/1/edit’

as-tu un “ressources users” dans ton routes.rb ?

Normalement, d’après la configuration du routage, l’écriture correcte de
cette route devrait être : ‘/users/1/edit’

tu veux dire /users/edit/1 ?

gUI

Le 26 mai 2008 19:19, Guillaume B. a écrit :

Je ne comprends pas pourquoi cette route fonctionne : ‘/users/1/edit’

as-tu un “ressources users” dans ton routes.rb ?

map.resources :users

en fait.

Normalement, d’après la configuration du routage, l’écriture correcte de
cette route devrait être : ‘/users/1/edit’

tu veux dire /users/edit/1 ?

Et map.resources :users, :collection => { :listing => :get }

pour l’action listing

-- Jean-François.


http://twitter.com/underflow_

Oui, j’ai plusieurs lignes en haut dans routes.rb, notamment :
map.resources :users

tu as surement fait un scaffold, et depuis rails 2.0, le scaffold est
RESTfull, c’est à dire qu’il te crée tout un tas de routes compatibles
REST. parallèlement bien sur il te crée des controlleurs capables d’y
répondre.

“rake routes” te donnera toutes les routes définies dans ton appli.

gUI

Jean-François Trân wrote:

Le 26 mai 2008 19:19, Guillaume B. a �crit :

Je ne comprends pas pourquoi cette route fonctionne : ‘/users/1/edit’

as-tu un “ressources users” dans ton routes.rb ?

map.resources :users

Oui, j’ai plusieurs lignes en haut dans routes.rb, notamment :
map.resources :users

Normalement, d’apr�s la configuration du routage, l’�criture correcte de
cette route devrait �tre : ‘/users/1/edit’

tu veux dire /users/edit/1 ?

Et map.resources :users, :collection => { :listing => :get }
pour l’action listing

Ahah! Merci pour l’astuce :smiley: je viens de tester et ça fonctionne.
Mais… c’est bizarre, le faut que ça ne soit pas automatique, d’après
le routage… enfin là c’est bon :slight_smile:

Merci encore.

Le 26 mai 2008 19:36, Zangief I. a écrit :

map.resources :users

Oui, j’ai plusieurs lignes en haut dans routes.rb, notamment :
map.resources :users

Ce que tu avais omis de nous le signaler dans ton message initial.

[…]

Et map.resources :users, :collection => { :listing => :get }
pour l’action listing

Ahah! Merci pour l’astuce :smiley: je viens de tester et ça fonctionne.
Mais… c’est bizarre, le faut que ça ne soit pas automatique, d’après
le routage… enfin là c’est bon :slight_smile:

Tu as dans ton config/routes, ces lignes
map.resources :users
map.resources :tags

qui vont générer un ensemble de routes, notamment les routes nommées
GET ‘/tags’ et GET ‘/tags/:id’

Quand tu fais un GET ‘/tags/listing’ ou GET ‘/tags/index’ depuis ton
butineur,
Rails va se charger de trouver la première route correspondante, et ce
sera GET ‘/tags/:id’, ce qui t’enverras sur TagsController#show. D’où
l’erreur que tu obtiens.

Les routes génériques

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

n’interviendront pas et si toute l’archi de ton appli est RESTful, elles
ne serviront à rien.

-- Jean-François.


http://twitter.com/underflow_

map.resources :users

en fait.

oups !

inconvénient de ne jamais le taper à la main…

gUI