2010-02-20 2 views
3

J'ai affaire à une application RESTful Rails très simple. Il y a un modèle d'utilisateur et j'ai besoin de le mettre à jour. Rails codeurs aiment faire:Comment gérez-vous les paramètres d'URL RESTful dans une application Ruby on Rails?

if @user.update_attributes(params[:user]) 
... 

Et d'après ce que je comprends REST, cette demande d'URL devrait fonctionner:

curl -d "first_name=tony&last_name=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml 

Cependant, il est tout à fait évident que ne fonctionnera pas parce que chaque paramètre d'URL sera analysé à la variable "params" et non "params [: user]"

J'ai un correctif hackish pour l'instant, mais je voulais savoir comment les gens gèrent habituellement cela.

Merci

Répondre

4

Il est juste une question de la façon dont Rails paramètres Parsis. Vous pouvez imbriquer des paramètres dans un hachage à l'aide de crochets. Quelque chose comme cela devrait fonctionner:

curl -d "user[first_name]=tony&user[last_name]=something2&v=1.0&_method=put" http://localhost:3000/users/1.xml 

Cela devrait se transformer en

{:user=>{:last_name=>"something", :first_name=>"tony"}} 

dans votre hachage params. C'est ainsi que les Rails forment des helpers qui construisent aussi le hash des params, ils utilisent les crochets dans l'attribut form name.

+0

ok, je suis effectivement au courant de ce concept mais je pensais qu'il pourrait y avoir un meilleur moyen. – Tony

3

C'est un compromis; Vous pouvez avoir des urls légèrement moche, mais très simple contrôleur/modèles. Ou vous pouvez avoir de bonnes URLs mais un contrôleur/modèles légèrement moche (pour faire l'analyse syntaxique des paramètres).

Par exemple, vous pouvez ajouter cette méthode sur votre modèle d'utilisateur:

class User < ActiveRecord::Base 

    #class method 
    def self.new_from_params(params) 
    [:action, :method, :controller].each{|m| params.delete(m)} 
    # you might need to do more stuff nere - like removing additional params, etc 
    return new(params) 
    end 
end 

maintenant sur votre contrôleur, vous pouvez faire ceci:

class UsersController < ApplicationController 
    def create 
    #handles nice and ugly urls 
    if(params[:user]) @user=User.new(params[:user]) 
    else @user = User.new_from_params(params) 
    end 

    if(@user.valid?) 
    ... etc 
    end 
    end 
end 

Cela traitera votre message bien, ainsi que les messages venant de formes.

J'ai généralement ce genre de comportement lorsque j'ai besoin que mes clients "copient et collent" des urls (c'est-à-dire sur des recherches qu'ils peuvent envoyer par e-mail).

+0

Cela ne semble pas être le meilleur moyen d'y parvenir, car vous auriez besoin d'une fonction différente pour chaque action UPDATE et NEW. Il semble que vous pourriez écrire une fonction pour extraire les paramètres qui n'appartiennent pas réellement aux modèles et l'utiliser pour UPDATE et NEW pour chaque modèle. Peut-être qu'il me manque quelque chose ... – Tony

+0

Je ne voulais pas laisser entendre que c'est la meilleure façon de faire. Dans la plupart des cas, la meilleure chose à faire est le comportement par défaut du rail. Je proposais une solution pour les cas (rares) dans lesquels vous avez besoin de bons paramètres. Dans mon cas particulier, la réparation de la fonction CREATE était suffisante, mais votre kilométrage peut varier. – kikito

Questions connexes