Forum: Rails France Testé l'existence d'un node avec un Id par R JS

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
2fd0206c71a1b22a9cc6293f38537461?d=identicon&s=25 Cyril Mougel (Guest)
on 2007-06-14 00:44
(Received via mailing list)
Bonjour,

Je suis en train de bidouiller pas mal avec RJS et je commence enfin à
en comprendre le fonctionnement et de facto à l'aimer. Mais
voilà,j'ai un comportement que je n'arrive pas à mettre en place.

Dans une page, j'ai un noeud avec un identifiant particulier, que
j'insére dans un autre noeud par la méthode :

page.insert_html :top, 'noeud', "<div id='new' >coucou</div>"

Au premier passage aucun problème. Mais je peux être amené à devoir
remplacer ce nouveaux noeud d'identifiant new avec le même template
RJS.

Donc je voudrais savoir comment testé l'existence ou pas d'un noeud
avec un identifiant précis.

J'ai vu que je pouvais faire :

page['new]

qui me renvoi un
#<ActionView::Helpers::JavaScriptElementProxy:0xb727371c>, mais je
n'ai pas trouvé la doc sur cette objet et donc les méthodes qui y sont
associées.

Merci de votre aide.

--
Cyril Mougel
13ea48f056b19349027d2f4a6921a46a?d=identicon&s=25 Jean-François (Guest)
on 2007-06-14 02:37
(Received via mailing list)
Cyril :
> avec un identifiant précis.
côté serveur, je ne pense pas que ce soit possible.

> J'ai vu que je pouvais faire :
>
> page['new]
>
> qui me renvoi un
> #<ActionView::Helpers::JavaScriptElementProxy:0xb727371c>, mais je
> n'ai pas trouvé la doc sur cette objet et donc les méthodes qui y sont
> associées.

Je ne vois pas en quoi cette documentation pourrait t'aider.

Tu n'as pas un dialogue entre le serveur et le client, genre :

"- Cher client, ce DOM id existe-t-il ?"
- Cher serveur, point du tout.
- Ah dans ce cas, je vous balance ce RJS sous cette forme-là
plutôt que celle-ci, faites-en bon usage.
- Bien reçu, je l'exécute. Au plaisir"

C'est plutôt :

- Tiens client, je te balance du RJS ou plutôt du JS généré
par Rails, tu l'exécutes et ya intérêt que ça marche !
- Ok chef.

La vérification si le dom id existe, je fais ci sinon je fais
ça doit se faire côté client et non côté serveur.

Quand le RJS est "dynamique", ie des structures de
contrôleRuby ou des boucles :

genre :

@comments.each do |comment|
  page["comment-#{@comment.id}"].hide
end

if ma_condition
  page.visual_effect ...
else
  page.replace_html...
end

Ces structures sont utilisées côté serveur.

Pour avoir du JS "dynamique" ie. avec des structures
de contrôle, tu utilises << , par exemple

page << "if ma_condition {"
page.replace_html ...
page << "}"

page << "Try.these {"
...
page << "}"

Mais tu peux aussi appeler une fonction JS que t'as
défini dans application.js, qui vérifie l'existence du noeud
avant de faire telle opération, et tu l'appelles côté RJS
avec page.call

Bon, je sais plus ce que je voulais dire, mais je m'arrête
là pour le moment.

  -- Jean-François.

--
À la renverse.
2fb6ebf03db24142b31d00edf4ab73b2?d=identicon&s=25 TslH (Guest)
on 2007-06-14 08:10
(Received via mailing list)
Le 14/06/07, Jean-François <jf.web3@gmail.com> a écrit :
> C'est plutôt :
>
> - Tiens client, je te balance du RJS ou plutôt du JS généré
> par Rails, tu l'exécutes et ya intérêt que ça marche !
> - Ok chef.
>
>
<offtopic>
  J'aime voir clients et serveur discuter ensemble, quelle chaleur! :)

  Vive Jean-François! \o/
</offtopic>
2fd0206c71a1b22a9cc6293f38537461?d=identicon&s=25 Cyril Mougel (Guest)
on 2007-06-14 08:20
(Received via mailing list)
On 6/14/07, Jean-François <jf.web3@gmail.com> wrote:
> > Donc je voudrais savoir comment testé l'existence ou pas d'un noeud
> > avec un identifiant précis.
>
> côté serveur, je ne pense pas que ce soit possible.

Si on peux le faire en faisant en JS :

if ($('new') == undefined) {
}

> Je ne vois pas en quoi cette documentation pourrait t'aider.
> - Tiens client, je te balance du RJS ou plutôt du JS généré
> par Rails, tu l'exécutes et ya intérêt que ça marche !
>   page["comment-#{@comment.id}"].hide
> Pour avoir du JS "dynamique" ie. avec des structures
> Mais tu peux aussi appeler une fonction JS que t'as
> défini dans application.js, qui vérifie l'existence du noeud
> avant de faire telle opération, et tu l'appelles côté RJS
> avec page.call
>
> Bon, je sais plus ce que je voulais dire, mais je m'arrête
> là pour le moment.

En faite, pour moi le RJS n'était qu'un utilitaire à créer du JS.
Donc, je voulais pas vérifier coté serveur si mon noeud était là, je
voulais créer une condition en JS. Donc si je comprend bien la
technique sera d'incorporer le JS directement dans mon objet page
comme cela :

page << if ($('new') == undefined){
page.insert_html ...
page << } else {
page.replace ...
page << }

En tout cas merci de ton explication.

--
Cyril Mougel
2fd0206c71a1b22a9cc6293f38537461?d=identicon&s=25 Cyril Mougel (Guest)
on 2007-06-14 08:29
(Received via mailing list)
On 6/14/07, Cyril Mougel <cyril.mougel@gmail.com> wrote:
> > >
> >
> >
> > - Ok chef.
> > end
> > de contrôle, tu utilises << , par exemple
> > défini dans application.js, qui vérifie l'existence du noeud
> comme cela :
>
> page << if ($('new') == undefined){
> page.insert_html ...
> page << } else {
> page.replace ...
> page << }
>
> En tout cas merci de ton explication.
>

Pour retour d'information, j'ai réussi à implémenter ce que je veux
avec le bout de code suivant :

page<< "if ($('errorExplanation') == 'undefined'){"
page.insert_html :top, 'form_add', '<div id="new">coucou</div>"
page<< "} else {"
page.replace 'new', '<div id="new">au revoir</div>"
page << "}"

Je met ce nouveau code, car celui-ci fonctionne et pas l'autre.


--
Cyril Mougel
140f1cb88275f7c391504de6e99edc78?d=identicon&s=25 Sébastien Gruhier (Guest)
on 2007-06-14 09:38
(Received via mailing list)
if ($('new')) devrait suffir
Par contre ce genre de code
page<< "if ($('errorExplanation') == 'undefined'){"
page.insert_html :top, 'form_add', '<div id="new">coucou</div>"
page<< "} else {"
page.replace 'new', '<div id="new">au revoir</div>"
page << "}"

Je ne trouve pas ça très propre et comme le propose Jean-François, c
plus clean de faire une fonction dans une fichier .js et de l'appeler
avec un page.call
C'est mieux de mettre le code client dans des fichiers JS plutôt que
de tout mélanger dans le contrôleur. Déjà que le page :update met du
code de la vue dans le contrôleur (mais je trouve ça plus facile à
lire que de faire des .rjs pour une ou deux lignes), si en plus on y
ajoute de la logique client! Pas top.

Seb
2fd0206c71a1b22a9cc6293f38537461?d=identicon&s=25 Cyril Mougel (Guest)
on 2007-06-14 09:53
(Received via mailing list)
On 6/14/07, Sébastien Gruhier <sgruhier@gmail.com> wrote:
> page.call
> C'est mieux de mettre le code client dans des fichiers JS plutôt que de tout
> mélanger dans le contrôleur. Déjà que le page :update met du code de la vue
> dans le contrôleur (mais je trouve ça plus facile à lire que de faire des
> .rjs pour une ou deux lignes), si en plus on y ajoute de la logique client!
> Pas top.
>

Là il ne s'agit pas de mon controlleur, mais d'une vue. De plus RJS
génére tout simplement du JS pur, donc si j'écrivais une méthode JS
dans un fichier et que j'en fesais l'import, je me retrouverais avec
le même code que celui généré par mon RJS.

J'avoue ne pas trop savoir quel pourrait être les bonne pratique. Tout
ceci n'est que supposition pour moi effectivement.

Si vous avez une bonne doc sur les bonnes pratiques d'utilisation de
RJS, je suis preneur.

--
Cyril Mougel
This topic is locked and can not be replied to.