2010-09-29 4 views
3

Je porte une application Merb sur Rails 3. Dans Merb, nous pourrions mettre un bloc Identify autour d'un itinéraire pour définir comment un paramètre: id route devait être fourni , par exemple,Définition: id dans les routes pour être quelque chose d'autre que id dans rails 3

# this is a Merb route that I want to port to Rails 3 routing; I get everything except 
# how to replicate the behavior of Merb's Identify block which doesn't require one to 
# futz with overriding to_param on user; a user instance gets passed to the url builder 
# ala url(:edit_password_reset, user) and this tells the router to use the 
# reset_password_token method on user to supply the :id value for this one route 
Identify User => :reset_password_token do 
    match("/reset-password/:id", :method => :get).to(:controller => "password_resets", :action => "edit").name(:edit_password_reset) 
end 

# and then later define more routes that use the user's id without a problem 
# since to_param was not overridden on user; here I have already translated to 
# Rails 3 and this works fine 
controller :users do 
    get "/register", :action => "new", :as => "new_user" 
    get "/users", :action => "index", :as => "users" 
    get "https://stackoverflow.com/users/:id", :action => "show", :as => "show_user" 
    get "https://stackoverflow.com/users/:id/edit", :action => "edit", :as => "edit_user" 
    put "https://stackoverflow.com/users/:id", :action => "update", :as => "update_user" 
    post "/users", :action => "create", :as => "create_user" 
end 

dans Rails, comme dans Merb, vous pouvez remplacer to_param pour fournir une valeur identifiant alternative pour les routes, mais pour un cas où une fois que vous voulez utiliser un identifiant et une autre fois que vous voulez utiliser une méthode différente sur le même objet (comme ci-dessus), identifier est pratique. Quel est l'équivalent de Rails 3? J'ai regardé à travers la source et les tests de Rails 3 et n'ai rien vu d'équivalent à Identifier. Ai-je manqué ça?

Je peux refactoriser les choses et peut-être ne pas en avoir besoin dans ce cas, mais j'aimerais quand même savoir si j'ai raté quelque chose.

Merci.

+0

Je suis curieux de savoir si vous avez déjà trouvé un bon moyen d'implémenter cette fonctionnalité. – dmkash

Répondre

1

Je suis tombé sur le même problème; s'avère le meilleur moyen est d'ignorer to_param entièrement lors de l'appel d'un URL ou d'un chemin. Par exemple:

# This will set params[:id] to @user.to_param 
edit_password_reset_url(@user) 

# This will set params[:id] to @user.reset_password_token 
edit_password_reset_url(@user.reset_password_token) 

En d'autres termes, to_param est seulement appelé lors du passage un record aux aides d'URL; Si vous lui passez une chaîne à la place, elle analysera simplement la chaîne.

Questions connexes