Remote_form_for, replace... et approche REST

Bonjour,

est-il possible d’actualiser par xhr un partial “fait” pour un appel
remote_form_for ?

Bon, un exemple sera plus parlant :

Voici ma vue :

<% remote_form_for(:film, :url => film_path(@film), :html => {:method
=> :put}) do |form|%>
<%= render :partial => ‘form’, :object => form %>
<% end %>

Voici mon action déclenché par le submit du formulaire ci-dessus :

def update
@film = Film.find(params[:id])

respond_to do |format|
  if @film.update_attributes(params[:film])
    format.html { redirect_to film_url(@film) }
    format.xml  { head :ok }
    format.js do
      render :update do |page|
        page.replace "form_film", :partial => 'form', :object

=> ???
end
end
else
format.html { render :action => “edit” }
format.xml { render :xml => @film.errors.to_xml }
format.js do
render :update do |page|
page.replace “form_film”, :partial => ‘form’, :object
=> ???
end
end
end
end
end

1/ Je cherche donc à actualiser le formulaire après la modification
effective de la ressource film…
Y a t’il une solution élégante qui permette de conserver le
remote_form_for pour faire cela ?

2/ autre question, dans le cas d’une approche rest, pour traiter l’appel
xhr, vaut-il mieux utiliser un nouveau format comme celui utilisé
ci-dessus (.js) ou passer par un request.xhr ? Quelle est la solution la
plus propre ? Je découvre REST donc peut-être cette question est-elle
stupide ?

A part cela, découvrant REST depuis peu, j’adhère complètement à cette
approche :slight_smile: génial !

Merci d’avance pour vos réponses.

Cdt,

JD

On 11/6/07, Jérémy Dierx [email protected] wrote:

1/ Je cherche donc à actualiser le formulaire après la modification
effective de la ressource film…
Y a t’il une solution élégante qui permette de conserver le remote_form_for
pour faire cela ?

Une solution plus propre serait de ne modifier que ton partial. Pour
cela tu peux mettre un div dans ton block form avec un id. C’est ainsi
cet id que tu remplaces par un nouveau partial. Ainsi tes partials
sont propres et tu changes de partial par le remote.

2/ autre question, dans le cas d’une approche rest, pour traiter l’appel
xhr, vaut-il mieux utiliser un nouveau format comme celui utilisé ci-dessus
(.js) ou passer par un request.xhr ? Quelle est la solution la plus propre ?
Je découvre REST donc peut-être cette question est-elle stupide ?

C’est plus propre comme tu le fais en le mettant dans le respond_to.
Ca permet d’éviter l’erreur du plusieurs return.

Par contre, j’essayerais d’enlever ton if dans le block respond_to, ca
c’est vraiment pas beau. Mais c’est un avis personnel.


Cyril M.

Bonjour cyril et merci pour ces réponses.

Le mercredi 07 novembre 2007 à 10:23 +0100, Cyril M. a écrit :

cet id que tu remplaces par un nouveau partial. Ainsi tes partials
sont propres et tu changes de partial par le remote.

oui effectivement, c’est ce que je fait, voici le partial que je n’ai
pas indiqué dans mon premier post :

<%= error_messages_for :film %>

<div><label for="film_titre">Titre</label><%= form.text_field 

:titre%

            ....

j’identifie donc par “form_film”

le problème c’est qu’avec la syntaxe de remote_form_for (par exemple
form.text_field), je ne sais pas comment renvoyer le partial par xhr
avec l’extrait de code suivant :

    format.js do
      render :update do |page|
        page.replace "form_film", :partial => 'form', :object

=> ???
end
end

Évidement, une autre solution serait d’utiliser plutôt form_remote_tag
et d’envoyer par exemple @film en object …
J’aime bien quand même la syntaxe remote_form_for et je souhaiterai la
conserver. Comment faire alors ?

2/ autre question, dans le cas d’une approche rest, pour traiter l’appel
xhr, vaut-il mieux utiliser un nouveau format comme celui utilisé ci-dessus
(.js) ou passer par un request.xhr ? Quelle est la solution la plus propre ?
Je découvre REST donc peut-être cette question est-elle stupide ?

C’est plus propre comme tu le fais en le mettant dans le respond_to.
Ca permet d’éviter l’erreur du plusieurs return.

ok donc je continu dans cette voie !

Par contre, j’essayerais d’enlever ton if dans le block respond_to, ca
c’est vraiment pas beau. Mais c’est un avis personnel.

Tu veux dire le mettre en amont du respond to ? Effectivement c’est
plus propre ^^

JD

On 11/7/07, Jérémy Dierx [email protected] wrote:

remote_form_for

         page.replace "form_film", :partial => 'form', :object => ?????
       end
     end

Évidement, une autre solution serait d’utiliser plutôt form_remote_tag et
d’envoyer par exemple @film en object …
J’aime bien quand même la syntaxe remote_form_for et je souhaiterai la
conserver. Comment faire alors ?

Effectivement, tu devrais plutôt mettre ton form dans le partial et le
changer entièrement avec le helper remote_form_for. Finalement le
partial ne sera pas beaucoup plus grand. A la rigueur si tu veux faire
du DRY à mort tu peux faire 3 partials. Celui avec le form qui pointe
sur 2 partial sans le form.

Par contre pour tenter de séparer les vues de controllers, je préfére
mettre toutes cette manipulation RJS dans une vue .rjs Ca permet de
limiter le code dans le controller et voir facilement le code qui sera
le code JS
généré.

ok donc je continu dans cette voie !

Par contre, j’essayerais d’enlever ton if dans le block respond_to, ca
c’est vraiment pas beau. Mais c’est un avis personnel.

Tu veux dire le mettre en amont du respond to ? Effectivement c’est plus
propre ^^

C’est
ça

Cyril M.

Le mercredi 07 novembre 2007 à 13:49 +0100, Cyril M. a écrit :

Y a t’il une solution élégante qui permette de conserver le
indiqué dans mon premier post :

render :update do |page|

changer entièrement avec le helper remote_form_for. Finalement le
partial ne sera pas beaucoup plus grand. A la rigueur si tu veux faire
du DRY Ã mort tu peux faire 3 partials. Celui avec le form qui pointe
sur 2 partial sans le form.

ok.

Par contre pour tenter de séparer les vues de controllers, je préfére
mettre toutes cette manipulation RJS dans une vue .rjs Ca permet de
limiter le code dans le controller et voir facilement le code qui sera
le code JS généré.

effectivement, au dessus d’un certain volume de code, mieux vaut placer
le code dans un .rjs pour faciliter la lecture et le rendre DRY

autre chose, le format .js semble être reconnu nativement par le
framework. En effet je viens de m’apercevoir qu’il n’était pas
nécessaire d’ajouter “.js” dans les url pour les reconnaître en tant que
requête xhr dans le controller. Finalement, utiliser le format .js
revient à tester si la requête est “xhr”… pratique

Merci pour tes réponses Cyril.

aller, j’attaque maintenant l’upload de fichiers ajax.

JD