2009-01-12 9 views
2

Je voudrais afficher une page de comparaison afin que l'utilisateur puisse comparer les propriétés de plusieurs objets dans ma base de données. N'importe quel nombre d'objets peut être comparé. Je voudrais aussi qu'il soit signable (donc un 'get').Comment faire passer un nombre flexible d'ID dans un contrôleur dans Rails?

Comment dois-je structurer mon URL/route pour le contrôleur?

Quelque chose comme/foo_compare/1_5_22 où je divise les identifiants en 1, 5 et 22 dans le contrôleur?

Peut-être/foo_compare/1/5/22, mais comment configurer l'itinéraire?

+0

être un bon citoyen stackoverflow.com et une étiquette répondre! –

Répondre

5

Je préfère

/compare?a=1&b=5&c=22 

Le 1_5_22 est juste fugly, et je pense que

/compare/1/5/22 

est une route très non RESTful.

+0

Je suis d'accord. Cela implique que 22 est imbriqué à l'intérieur de 5, qui est imbriqué à l'intérieur 1. Au lieu de cela, ces ID sont tous des pairs. –

+0

Je suis d'accord. Je n'étais pas content de l'une ou l'autre de mes suggestions dans la question. Comment pourrais-je autoriser une liste illimitée de cette manière? Je détesterais coder dur a, b, c ... et ce qui arrive quand j'arrive à 27 objets de comparaison (je doute qu'un utilisateur veuille comparer autant d'éléments, mais on ne sait jamais). – RichH

+0

Et si vous utilisiez des chiffres à la place des caractères? Quelque chose comme/comparer? 1 = 2 & 2 = 22 & 3 = 5. Vous pourriez le comprendre comme "produit 1, produit 2, produit 3 ...". – ARemesal

4
a) url_for(:controller => "my_controlelr",:action => "compare", :id => [1,2,3,4]) becomes "id"=>"1/2/3/4" 

lien serait my_controlelr/comparateur/1/2/3/4

b) url_for(:controller => "my_controlelr",:action => "compare", :ids => [1,2,3,4]) becomes "ids" => ["1", "2", "3", "4"] 

lien serait my_controlelr/comparaison /? Ids [] = 1 & ids [] = 2 & ids [ ] = 3 & ids [] = 4

Aucun itinéraire spéciales sont nécessaires

+0

option (b) semble plus propre –

4
# routes.rb 
map.connect 'compare/*:comparisons', :controller => 'whatever', :action => 'you_name_it' 

# in the controller 
ids = params[:comparisons].split('/') 

Ceci est mappé par ex./compare/1/5/203.

1

Bien que je n'aime pas les traits de soulignement, je pense qu'une approche délimitée est raisonnable. J'utiliserais probablement ';'

Logiquement, ceci est un ensemble d'ID, les exposant comme une série de paramètres n'est pas grande, sauf si vous voulez vraiment faire respecter une limite sur le nombre d'entre eux

Questions connexes