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]
-~----------~----~----~----~------~----~------~--~---

Répondre à