Le 14 juin 2008 18:42, Alfref Bouton a écrit : > > Bonjour, > Voila j'epeluchais le code des scaffold genere par Rails, j'ai tout > compris a part 1 detail ... > > Cela concerne l'action new : > Je vois dans le controller , dans l'action new, l'instanciation de > l'objet, jusqu'a la c'est normal, dans la view, rien de special, ma > question est : > Pourquoi quand je soumets le formulaire, ca passe dans l'action create, > alors que dans la view, il n'y a aucune reference a Create ... > J'ai chercher partout, dans les routes et tout je ne trouve rien ... > > Je vous mets le code de l'action new et create, si ca peut vous aider... > > # GET /products/new > # GET /products/new.xml > def new > @product = Product.new
1/ Dans le cas où on a un nouvel enregistrement @product = Product.new Dans la vue correspondante, tu as un formulaire : form_for(@product) do |f| ... end Quand tu ne passes qu'une instance AR::B en argument à form_for, celui-ci va utiliser les conventions de Rails pour déduire l'url et le verbe HTTP adapté. Rails va le déduire depuis l'objet @product. * Pour le verbe HTTP, il le détermine en faisant @product.new_record?. Rails sait alors s'il a affaire à un produit déjà existant dans la base ou fraîchement créé. Donc là, @product.new_record? renvoie true et Rails décide d'avoir un POST ( :method => :post ) . * Pour l'url, il va passer par la méthode #polymorphic_path(@product) qui va appeler le path helper #products_path. On aura donc '/products'. (il sait qu'il faut appeler products_path car @product est un objet de classe Product donc Rails se doute que le nom de la ressource utilisée est 'product' (c'est le boulot du module ActionController::RecordIdentifier). En suivant encore les conventions de rails, on a un nouveau produit, donc il va prendre le path helper #products_path plutôt que #product_path) Finalement le formulaire, une fois validée, enverra bien ses données en faisant un POST /products, ce qui en suivant les conventions REST de Rails (car on a fait un map.resources :product dans config/routes.rb), dirigera la requête vers l'action ProductsController#create. 2/ Dans le cas où on a @product = Product.find params[:id], donc dans le cas d'une édition d'un enregistrement, on aura cette fois-ci : * Pour le verbe HTTP, @product.new_record? retourne false, donc Rails utilisera le verbe PUT ( :method => :put). (plus exactement, le PUT sera simulé par une requête POST avec un champ caché avec le paramètre _method=put (et Rails sait reconnaître cette pseudo-requête POST en requête PUT)) * Pour l'url, polymorphic_path(@product) appellera cette fois-ci le path helper #product_path avec le bon argument (@product), soit product_path(@product), c'est-à-dire '/products/42' (par exemple). Finalement, on fera un PUT /products/42 quand on validera le formulaire, et d'après les conventions REST de Rails, Rails traitera la requête par l'action ProductsController#update. Conclusion : le form_for(@product) a l'air un peu magique comme ça, mais au final, pas tant que ça. -- Jean-François. -- http://twitter.com/underflow_ --~--~---------~--~----~------------~-------~--~----~ Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de Google Groups. Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse [email protected] Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED] -~----------~----~----~----~------~----~------~--~---
