Obtenir le nom de la classe d'un controlleur depuis une URL

Bonjour,

Une question certainement très simple. Comment obtenir le nom de la classe
du controller qui va traiter une requête en fonction de l’URL demandée.
Par exemple, je fais :
pouet =
ActionController::Routing::Routes.recognize_path(’/applications/users/edit’)

dans pouet[:controller] j’ai “applications/users”, je suis content mais
maintenant je veux obtenir le nom de la classe du controller
correspondant
(Applications::UsersController en l’occurence).
Je pourrais faire un “pouet[:controller].camelize + ‘Controller’” mais
je
ne trouve pas ça très générique.

Merci d’avance.

Jérôme

controller.class.name ?

++

yk

Le 23/05/07, Jérôme Schell[email protected] a écrit :

On Wed, 2007-05-23 at 12:37 +0200, Jérôme Schell wrote:

(Applications::UsersController en l’occurence).
Je pourrais faire un “pouet[:controller].camelize + ‘Controller’” mais je
ne trouve pas ça très générique.

pouet[:controller] contient bien une instance de la classe recherchée ?
si oui un pouet[:controller].class.name devrait faire l’affaire.

controller.class.name ?

Si je ne m’abuse ceci me donne le nom de la classe du controller
courant.
Moi je veux le nom de la classe (ou la classe elle-même) d’un controller
en fonction d’une url quelconque (pas uniquement l’URL courante).


Jérôme

pouet[:controller] contient bien une instance de la classe recherchée ?
si oui un pouet[:controller].class.name devrait faire l’affaire.

Non, comme je l’ai indiqué pouet[:controller] contient une chaîne
(“applications/users”).
Pour l’instant j’ai fait pouet[:controller].camelize + ‘Controller’ pour
obtenir le nom de la classe du controller. Je me disais juste que Rails
en
interne avait une méthode qui faisait ça, vu qu’il doit bien le faire à un
moment ou un autre.


Jérôme

Jérôme :

pouet[:controller] contient bien une instance de la classe recherchée ?
si oui un pouet[:controller].class.name devrait faire l’affaire.

Non, comme je l’ai indiqué pouet[:controller] contient une chaîne
(“applications/users”).
Pour l’instant j’ai fait pouet[:controller].camelize + ‘Controller’ pour
obtenir le nom de la classe du controller. Je me disais juste que Rails en
interne avait une méthode qui faisait ça, vu qu’il doit bien le faire à un
moment ou un autre.

Si tu fais :

ActionController::Routing::Routes.recognize(request)

Il va te le faire pour toi, car cette méthode contient cette ligne :

“#{params[:controller].camelize}Controller”.constantize

Mais il te faut manipuler un objet AbstractRequest au lieu
d’un path. Dans ce cas-là, tu t’inspires de la méthode
recognized_request_for dans assertions/routing.rb
qui passe par un objet TestRequest :

def recognized_request_for(path, request_method = nil)
path = “/#{path}” unless path.first == ‘/’

Assume given controller

request = ActionController::TestRequest.new({}, {}, nil)
request.env[“REQUEST_METHOD”] = request_method.to_s.upcase if
request_method
request.path = path

ActionController::Routing::Routes.recognize(request)
request
end

Donc controller = ActionController::Routing::Routes.recognize(request)
puis controller.name

sachant qu’on tient compte de la méthode HTTP.

Si tu ne veux pas passer par un objet Request, tu fais :

“#{nom_controleur.camelize}Controller”.constantize

et puis c’est tout !

-- Jean-François.


À la renverse.

et puis c’est tout !

C’est tout et c’est parfait. Merci pour cet éclairage. J’avais opté pour
la dernière solution et je vais rester comme ça.

Merci.

Jérôme

Bonjour,

petite question de routes et de ce qu’il est possible de faire (ou
pas) avec Rails :

J’ai aujourd’hui la route suivante :

map.connect ‘:title’,
:controller => ‘articles’, :action => ‘permalink’

L’action permalink va chercher un article en base en fonction
du :title, jusque là, rien de bien
compliqué.
Mais je voudrais que, dans le cas où ça ne ramène rien, il me fasse
la même mais avec le contrôleur ‘categories’

Je ne suis malheureusement pas certain que cela soit possible
uniquement en touchant les routes, et je ne peux malheureusement pas
toucher au code de l’application.

Merci d’avance
Frédéric


Frédéric de Villamil
[email protected] tel: +33 (0)6 62 19 1337
http://fredericdevillamil.com Typo : http://typosphere.org

Frédéric :

Mais je voudrais que, dans le cas où ça ne ramène rien,
il me fasse la même mais avec le contrôleur ‘categories’

Je ne suis malheureusement pas certain que cela soit
possible uniquement en touchant les routes, et je ne peux
malheureusement pas toucher au code de l’application.

Sans modifier le code de l’appli, pour ma part, je ne vois
pas.

– Jean-François.


À la renverse.