Forum: Rails France Rails et javascript

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.
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-15 15:48
Bonjour,

 Peut-on mélanger du javascript avec du ruby ? Je m'explique. A partir
d'un fichier xsd via un fichier xsl, je génère un formulaire html. J'ai
besoin de créer des champs inputs à volonté selon le nombre souhaité par
l'utilisateur. Si celui-ci entre 3 cases, il tape sur "entrée" et les
trois champs apparaissent.

D'ou la nécessité d'utiliser javascript... Y a t'il un autre moyen de le
faire avec ruby sans devoir valider le formulaire ?
059ed46172a087063ce26250e44c8627?d=identicon&s=25 Fernando Perez (fernando)
on 2009-04-15 15:54
> D'ou la nécessité d'utiliser javascript... Y a t'il un autre moyen de le
> faire avec ruby sans devoir valider le formulaire ?

Avec Prototype et render :partial ça se fait. Ca permet de créer du
javascript qui va générer du code ruby (le partial) qui va générer ton
html: champs, boutons, etc.
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-21 15:35
Dans ma vue, je souhaite créer un bouton "ajouter" qui ajoute un champ
de formulaire par exemple.

J'intègre le code suivant :

<%= link_to_remote "Ajouter",
            :url=>{:action=>"ajouter"}
%>

Dans mon contrôleur, je vais ajouter :

def ajouter
    @utilisateurs.find(:all)
end

(même action que index)

et je rajoute le chemin dans mon fichier routes.rb :
map.connect 'utilisateurs', :controller => 'utilisateurs', :action =>
'ajouter',
              :conditions => { :method => :get }


et il ne me restera plus qu'à intégrer mon ajouter.rjs dans la partie
"view" avec le code suivant :

page.insert_html :bottom, "code_champ", "<input type='text'
name='test'>"

Mais quand je clique sur le bouton, rien ne se passe... Je ne vois pas
ce qui cloche à part le fait que c'est moi qui code...
79b719d7f060027f31511f43f030e5c7?d=identicon&s=25 Tony Chauveau (kusanar)
on 2009-04-21 16:58
> page.insert_html :bottom, "code_champ", "<input type='text'
> name='test'>"


S'il s'agit juste d'ajouter un input a ton formulaire, nul besoin de
passer par ton controller
un simple link_to_function avec un petit js qui te colle ton input
suffit
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-21 17:29
Tony Chauveau wrote:
>> page.insert_html :bottom, "code_champ", "<input type='text'
>> name='test'>"
>
>
> S'il s'agit juste d'ajouter un input a ton formulaire, nul besoin de
> passer par ton controller
> un simple link_to_function avec un petit js qui te colle ton input
> suffit

En fait, j'ai utilisé le scaffold pour générer une application simple.
J'ai ma vue new.html dans laquelle je souhaite intégrer mon code
permettant l'ajout de champ. En pratique, j'ai un champ par attribut de
ma base (un champ texte pour nom, un pour prenom...). La, je souhaite
avoir par exemple trois champs prenoms.

Est ce que je ne dois pas utiliser les balises rhtml ? et mettre par
exemple quelque chose comme ça (ça ne marchera pas, c'est pour
l'idée...) :
>> page.insert_html :bottom, "code_champ", <%= f.label :test %><%= f.text_field 
:test_+compteur %>
79b719d7f060027f31511f43f030e5c7?d=identicon&s=25 Tony Chauveau (kusanar)
on 2009-04-21 18:34
Monseigneur babiben wrote:
> Tony Chauveau wrote:
>>> page.insert_html :bottom, "code_champ", "<input type='text'
>>> name='test'>"
>>
>>
>> S'il s'agit juste d'ajouter un input a ton formulaire, nul besoin de
>> passer par ton controller
>> un simple link_to_function avec un petit js qui te colle ton input
>> suffit
>
> En fait, j'ai utilisé le scaffold pour générer une application simple.
> J'ai ma vue new.html dans laquelle je souhaite intégrer mon code
> permettant l'ajout de champ. En pratique, j'ai un champ par attribut de
> ma base (un champ texte pour nom, un pour prenom...). La, je souhaite
> avoir par exemple trois champs prenoms.
>
> Est ce que je ne dois pas utiliser les balises rhtml ? et mettre par
> exemple quelque chose comme ça (ça ne marchera pas, c'est pour
> l'idée...) :
>>> page.insert_html :bottom, "code_champ", <%= f.label :test %><%= f.text_field 
:test_+compteur %>

Ben...comme je l'ai dis au dessus, faire un appel a ton controller ne se
justifie que si tu as besoin de récupérer des données (par exemple,
chercher une liste d'utilisateurs pour l'afficher).
Ici, nul besoin de tout ceci, tu remplace juste ton link_to_remote par
un truc du style :

link_to_function "ajouter", "ajout_champs();"

Et tu ajoute ton javascript en début de page :

<script ..>
var i = 1;
function ajout_champs() {
  // insertion du champs et incrémentation de ta variable i
}
</script>
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-22 15:20
en fait, ça a marché sans faire appel au contrôleur! J'ai bien mes X
champs input de type texte. Je m'interroge sur le traitement des
données. Mes champs vont-ils etre pris en compte par le controleur avec
ceux qui existent déjà ?

Dans mon contrôleur, j'ai l'action new qui permet de traiter l'ajout
d'informations. Je dispose d'une table 'maison' par exemple avec un id
(bidon dans mon cas), un nom unique et un champ personne. Dans mes
champs texte input ajoutés précédemment, je vais avoir des noms de
personnes et je souhaite intégrer dans ma bdd sous forme de nouvelles
lignes. Je vais devoir récupérer le contenu de ces champs. Peut on faire
un $_POST[champ] ? quelque chose comme ça...
Ce ne sont pas des attributs de mon objet comme nom_maison ou encore
personne

Maison :
ID - NOM_MAISON - PERSONNE
1 MAISON_VERTE JULIEN
2 MAISON_VERTE RICHARD
3 MAISON_VERTE DAVID
4 MAISON_VERTE PIERRE
79b719d7f060027f31511f43f030e5c7?d=identicon&s=25 Tony Chauveau (kusanar)
on 2009-04-22 15:30
Monseigneur babiben wrote:
> d'informations. Je dispose d'une table 'maison' par exemple avec un id
> (bidon dans mon cas), un nom unique et un champ personne. Dans mes
> champs texte input ajoutés précédemment, je vais avoir des noms de
> personnes et je souhaite intégrer dans ma bdd sous forme de nouvelles
> lignes. Je vais devoir récupérer le contenu de ces champs. Peut on faire
> un $_POST[champ] ? quelque chose comme ça...
> Ce ne sont pas des attributs de mon objet comme nom_maison ou encore
> personne


params[:champs]
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-22 17:16
ok merci mais il y a pas un moyen pour faire params[:personne_0],
params[:personne_1]... car j'ai 4 champs.

J'ai essayé d'utiliser un compteur mais il n'est pas pris en compte. On
doit bien pouvoir faire un params[:personne[compteur]] ?
5183febd0dfb911f94c270ddd174fe71?d=identicon&s=25 guillaume belleguic (Guest)
on 2009-04-22 17:24
(Received via mailing list)
le mieux c'est :params[:personnes].each do |person|  puts
person[:mon_champ_1]
  puts person[:mon_champ_2]
end

pour le formulaire :
<% f.fields_for "personnes[]" do |answer| %> (ou un truc comme ca)
2009/4/22 Monseigneur babiben <list-incoming@andreas-s.net>
5d3f7d8e534a892e3029a3f3b9761de5?d=identicon&s=25 Zaphod Beeblebrox (Guest)
on 2009-04-22 18:21
(Received via mailing list)
Hé Monseigneur tu veux pas qu'on code l'appli pour toi non plus ?
Je te conseil de regarder ces screencasts qui te permettrons de
résoudre pas mal de tes soucis
http://railscasts.com/episodes?search=complex


On 22 avr, 17:16, Monseigneur babiben <list-incom...@andreas-s.net>
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-22 18:25
Ok, d'après ce que j'ai lu sur le field_for
(http://www.frailers.net/articles/11-editer-plusieu...),
je ne vois pas trop comment je pourrais l'appliquer dans mon cas. Je ne
cherche à disposer d'un formulaire avec des champs pré-remplis provenant
d'un autre contrôleur comme l'exemple du blog.

Dans mon cas, j'ai seulement un formulaire avec des informations (sous
forme de champ texte) et je souhaite intégrer des données "étrangères"
(toujours sous forme de champ texte) ayant le même nom seulement
différencié par un compteur à la fin.

Et le problème concerne le traitement de ces paramètres par le
controleur (personne_0, personne_1)...

Je dois surement être à l'ouest ?????
79b719d7f060027f31511f43f030e5c7?d=identicon&s=25 Tony Chauveau (kusanar)
on 2009-04-22 18:53
Monseigneur babiben wrote:
> Ok, d'après ce que j'ai lu sur le field_for
> (http://www.frailers.net/articles/11-editer-plusieu...),
> je ne vois pas trop comment je pourrais l'appliquer dans mon cas. Je ne
> cherche à disposer d'un formulaire avec des champs pré-remplis provenant
> d'un autre contrôleur comme l'exemple du blog.
>
> Dans mon cas, j'ai seulement un formulaire avec des informations (sous
> forme de champ texte) et je souhaite intégrer des données "étrangères"
> (toujours sous forme de champ texte) ayant le même nom seulement
> différencié par un compteur à la fin.
>
> Et le problème concerne le traitement de ces paramètres par le
> controleur (personne_0, personne_1)...
>
> Je dois surement être à l'ouest ?????

Le field_for, c'est juste pour te simplifier la vie en utilisant un
tableau ;)
Mais tu n'es pas non plus obligé, tu peux aussi utiliser params[:champs]
sous la forme params["champs"] (plus facile de manipuler des chaines
dans ton cas)

Maintenant, sans être aussi vindicatif qu'au dessus, tout ceci se trouve
très facilement dans le 1er tutoriel ou bouquin sur Rails. Prends le
temps de lire, tu gagneras bcp de temps ensuite
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-23 10:08
ok merci. Mais j'ai trouvé une solution... Par contre, comment execute
t-on directement du javascript dans ruby sans utiliser un bouton. Par
exemple, j'ai ma fonction bidule déclarée entre les balises
<script></script> au début de mon code.

Je souhaiterais l'executer dans la page sans avoir à cliqué sur un
lien...
60b8d3f023999069046e5bb5c2fbd58a?d=identicon&s=25 Céd B. (akyrho)
on 2009-04-23 10:22
(Received via mailing list)
Tu peux exécuter un certain nombre d'action une fois que la page est
complètement chargée, par exemple :


<script type="text/javascript">
<![CDATA[
  Event.observe(window, 'load', function() {
    $('username').focus();
    // Le reste de tes actions ici
  });
]]>
</script>
Source : http://snippets.dzone.com/posts/show/1775

Cela répond à ta question?


Bousmanne Cédric
http://cedricbousmanne.com/






Le 23-avr.-09 à 10:08, Monseigneur babiben a écrit :
2fd0206c71a1b22a9cc6293f38537461?d=identicon&s=25 Cyril Mougel (shingara)
on 2009-04-23 10:41
(Received via mailing list)
Monseigneur babiben a écrit :
> ok merci. Mais j'ai trouvé une solution... Par contre, comment execute
> t-on directement du javascript dans ruby sans utiliser un bouton. Par
> exemple, j'ai ma fonction bidule déclarée entre les balises
> <script></script> au début de mon code.
>
> Je souhaiterais l'executer dans la page sans avoir à cliqué sur un
> lien...
>
<body load="maJS">
</body>

ou alors sur l'evenement load dans ton <script>

Mais c'est du pur JS

--
Cyril Mougel
http://blog.shingara.fr
79b719d7f060027f31511f43f030e5c7?d=identicon&s=25 Tony Chauveau (kusanar)
on 2009-04-23 11:04
> Par contre, comment execute
> t-on directement du javascript dans ruby sans utiliser un bouton.

Il n'y a que moi que cette phrase choque?

On ne peut exécuter de javascript dans ruby...Ruby se situant côté
serveur et Javascript côté client.

Ton javascript se trouve dans ta vue ou si tu veux rester propre dans un
fichier js que tu charge.
B1ad30497d30c983b8a9f4c6cf6fd509?d=identicon&s=25 ben ******* (babiben)
on 2009-04-23 16:52
Tony Chauveau wrote:
>> Par contre, comment execute
>> t-on directement du javascript dans ruby sans utiliser un bouton.
>
> Il n'y a que moi que cette phrase choque?
>
> On ne peut exécuter de javascript dans ruby...Ruby se situant côté
> serveur et Javascript côté client.
>
> Ton javascript se trouve dans ta vue ou si tu veux rester propre dans un
> fichier js que tu charge.
Oui en effet, je m'exprime très mal. C'est vrai que ma phrase n'a aucun
sens. Désolé.
This topic is locked and can not be replied to.