Rails 2 pense que le nom de ma fonction est l'ID pour show()

Bonjour,

J’ai écrit il y a quelque temps une application Rails 1.2.6 (via
RadRails), en utilisant “Generators” / “scaffold” sur une base Oracle
existante. Maintenant que je suis passé à Rails 2.0.2., je crée de
nouveaux Contrôleurs et ceux-ci sont plus “REST-like” ; ça ne me
dérange pas…

J’ai pris l’habitude de créer des fonctions qui me renvoient les
résultats sous forme de XML, comme celle-ci :

def simple_list_for_prod_id_xml
@foo_bars = FooBars.find_by_sql(
[“SELECT blah blah blah FROM FOO_BARS WHERE PROD_ID=?”,
params[:prod_id]] )

  render :xml => @foo_bars.to_xml

end

Malheureusement, lorsque j’essaie d’y accéder via l’URL
http://localhost:3003/foo_bars/simple_list_for_prod_id_xml?prod_id=70,
le serveur pense que j’appelle la fonction générée show()
implicitement, et que je lui passe l’ID
“simple_list_for_prod_id_xml”… Comment puis-je appeler ma nouvelle
fonction explicitement ?

Je vous demande de bien vouloir m’excuser si la réponse a déjà été
donnée sur un forum, mais je n’ai pas su la trouver… Merci,

Christophe.

Christophe :

Malheureusement, lorsque j’essaie d’y accéder via l’URL
http://localhost:3003/foo_bars/simple_list_for_prod_id_xml?prod_id=70,
le serveur pense que j’appelle la fonction générée show()
implicitement, et que je lui passe l’ID
“simple_list_for_prod_id_xml”…

Comment puis-je appeler ma nouvelle
fonction explicitement ?

utilise l’option :member => { :simple_list_for_prod_id_xml => :get }
dans map.resources

(le nom est affreux…)

C’est expliqué dans ton fichier config/routes.rb :

Sample resource route with options:

map.resources :products, :member => { :short => :get, :toggle =>

:post }, :collection => { :sold => :get }

– Jean-François.


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

Merci à vous deux pour votre précieuse aide.

Je n’ai pas su implémenter la solution de Cyril :
map.controller /foo_bars/simple_list_for_prod_id_xml/:id, :controller
=> :foo_bars, :action => simple_list_for_prod_id_xml
(“unknown regexp options -pl” & “Ambiguous first argument; make
sure.”)

La solution de Jean-François a bien marché :
map.resources :foo_bars, :collection => { :simple_list_for_prod_id_xml
=> :get }

Heureusement que tu as inclus l’exemple du fichier routes.rb, car j’ai
la version pré-Rails2 de ce fichier qui ne le contient pas…

Christophe.

2008/1/17 gers32 [email protected]:

résultats sous forme de XML, comme celle-ci :
http://localhost:3003/foo_bars/simple_list_for_prod_id_xml?prod_id=70,
le serveur pense que j’appelle la fonction générée show()
implicitement, et que je lui passe l’ID
“simple_list_for_prod_id_xml”… Comment puis-je appeler ma nouvelle
fonction explicitement ?

Je vous demande de bien vouloir m’excuser si la réponse a déjà été
donnée sur un forum, mais je n’ai pas su la trouver… Merci,

En fait au niveau des routes, c’est le premier servi, premier
arrivé.Donc je te conseillerais d’ajouter dans ton route.rb avant la list de
map.resources :foo_bars, une ligne forcant ta route particulière.

map.controller /foo_bars/simple_list_for_prod_id_xml/:id, :controller
=> :foo_bar, :action => simple_list_for_prod_id_xml

J’espère avoir été un peu clair.


Cyril M.
http://blog.shingara.fr

Christophe :

Merci à vous deux pour votre précieuse aide.

Je n’ai pas su implémenter la solution de Cyril :

map.controller /foo_bars/simple_list_for_prod_id_xml/:id, :controller
=> :foo_bars, :action => simple_list_for_prod_id_xml
(“unknown regexp options -pl” & “Ambiguous first argument; make
sure.”)

Le code est faux :

map.chikungunya ‘/foo_bars/simple_list_for_prod_id_xml/:id’,
:controller => ‘foo_bars’,
:action => ‘simple_list_for_prod_id_xml’

C’est d’après moi, une mauvaise idée d’utiliser une route
nommée’controller’, ce n’est pas un bon choix de nom. ‘chikungunya’ ne
vaut peut-être pas mieux, mais peu de risque de collision de nom
avec Rails.

La solution de Jean-François a bien marché :
map.resources :foo_bars, :collection => { :simple_list_for_prod_id_xml
=> :get }

Heureusement que tu as inclus l’exemple du fichier routes.rb, car j’ai
la version pré-Rails2 de ce fichier qui ne le contient pas…

Tu devrais te familiariser avec Rails 2 ou au minimum générer
un squelette d’appli pour te familiariser ou déceler les
nouveautésde ce genre. Certaines sont plus visibles ( config/boot.rb, répertoire
config/initializers… ) que d’autres ( ActiveSupport::TestCase,
ActionController::TestCase à la place de Test::Unit::TestCase par
exemple).

– Jean-François.


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

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs