S.O.S AJAX/GET/CONTROLLER/CASE/ETC/ = ok mais pas > ça

#~ S.O.S AJAX/GET/CONTROLLER/CASE/ETC/ = ok mais pas > ça

Bonjour, je me pseudomme zepo, je suis une fille, je débute et j’ai
besoin de votre aide
Je me prends la tête sur une opération. C’est une petit test pour que je
comprenne bien comment fonctionne MVC/AJAX

J’ai débuté Ruby sérieusement il y a une semaine comme ça ou deux, car
je dors plus :slight_smile:

Voici le contexte de mon problème: Je ne comprends pas la chose la plus
basique qui soit.
J’ai simulé l’arrivée de mon url dans mon controller pour tester mon
ajax une url,
en la construisant, bien que j’aurais pu la mettre directement dans
URI() ou parse etc.
Je sais pas comment expliquer.

Le model Lifestyle n’est pas en relation avec ActiveRecord pour m’éviter
quelques contraintes durant le test

L’action est diet.erb appelée par une fonction javascript qui le show
dans le _my_diet dans une span

La vue est layout application.rhtml#lifestyle#index.erb, elle rend un
partial _my_diet.erb

Le truc c’est que j’ai le mauvais sentiment d’avoir tout fait à l’enver
et je ne comprends pas, malgrés la doc, car j’ai beaucoup de mal avec
les markup,

Comment diable mon GET et cette *** d’url qui arrive en header,que je
vois en live avec LiveHTTP Header, je la fait venir dans mon code pour
de vrai en live ??
vu que mon case fonctionne, mon ajax aussi, tout fonctionne mais pas
quand je me dis c’est le moment de faire venir cette *** url dans la
zone
ou est h dans mon essai bah je trouve pas, je trouve pas comment faire
quelle methode …

Je comprends pas qui request qui dans mon histoire… et qui lit qui.

HELP :slight_smile:

_my_diet ( pas encore avec FormHelper ou FormTagHelper )

Vegetarien Vegetalien Canibale ...

le javascript

oa = new Oajax();
o = oa.createOajax();

function sendQ(){
for( i=1 ; i<=3 ; i++ ){
if( this.document.getElementById(“f”).regime.options[i - 1].selected
){
this.o.open(‘get’, ‘diet?ou=’+i, true);
this.o.onreadystatechange = helpQ;
this.o.send(null);
}
}
}
function helpQ(){
if (o.readyState == 4){ document.getElementById(“bj”).innerHTML =
o.responseText; }
}

le ruby

#~ fxri irb:session:1
#~ first:part:paste
require ‘uri’
require ‘net/http’

#~ model test
class Lifestyle
@@diets = { :veran => ‘vegetarian’, :vegan => ‘vegetalian’, :cani =>
‘cannibal’ }

def initialize(style = :style)
@style = style
end

def diet
@@diets[@style]
end
end
#~ => nil

#~ second part:paste
#~ :controller => ‘lifestyle’, => :action ‘diet’

h = URI::HTTP.build(:scheme => ‘http’, :host=> ‘localhost’, :port =>
‘3000’, :path => ‘/lifestyle/diet’, :query => ‘ou=2’)
#~ => #<URI::HTTP:0x62e916c
URL:http://localhost:3000/lifestyle/diet?ou=2>

@s = URI(“#{h}”).query.slice(3,2)
#~ => “2”
#~ variant @s =
URI.split(“#{h}”)[7].slice(3,2)

case @s #~ => “2”
when 1.to_s #~ /\w*[ou]?[0-1]$/
@diet = Lifestyle.new(:veran).diet
when 2.to_s #~ /\w*[ou]?[1-2]$/
@diet = Lifestyle.new(:vegan).diet
when 3.to_s #~ /\w*[ou]?[2-3]$/
@diet = Lifestyle.new(:cani).diet
else
@diet = “Tripple fok”
end #~ => in this case “vegetalian”

@diet + @s     #~ => "vegetalian2" temporary help me to see the @s

value in the .erb → vegetalian 2
#~ end controller

h                   #~ => #<URI::HTTP:0x630eb24

URL:http://localhost:3000/lifestyle/diet?ou=2>
@diet #~ => “vegetalian”
@s #~ => “2”

Emma/zepo

#~ S.O.S AJAX/GET/CONTROLLER/CASE/ETC/ = ok mais pas > ça

Bonjour, je me pseudomme zepo, je suis une fille, je débute et j’ai
besoin de votre aide
Je me prends la tête sur une opération. C’est une petit test pour que je
comprenne bien comment fonctionne MVC/AJAX

J’ai débuté Ruby sérieusement il y a une semaine comme ça ou deux, car
je dors plus :slight_smile:

Voici le contexte de mon problème: Je ne comprends pas la chose la plus
basique qui soit.
J’ai simulé l’arrivée de mon url dans mon controller pour tester mon
ajax une url,
en la construisant, bien que j’aurais pu la mettre directement dans
URI() ou parse etc.
Je sais pas comment expliquer.

Le model Lifestyle n’est pas en relation avec ActiveRecord pour m’éviter
quelques contraintes durant le test
L’action est diet.erb appelée par une fonction javascript qui le show
dans le _my_diet dans une span
La vue est layout application.rhtml#lifestyle#index.erb, elle rend un
partial _my_diet.erb

Le truc c’est que j’ai le mauvais sentiment d’avoir tout fait à l’enver
et je ne comprends pas, malgrés la doc, car j’ai beaucoup de mal avec
les markup,

Comment diable mon GET et cette *** d’url qui arrive en header,que je
vois en live avec LiveHTTP Header, je la fait venir dans mon code pour
de vrai en live ??
vu que mon case fonctionne, mon ajax aussi, tout fonctionne mais pas
quand je me dis c’est le moment de faire venir cette *** url dans la
zone
ou est h dans mon essai bah je trouve pas, je trouve pas comment faire
quelle methode …

Je comprends pas qui request qui dans mon histoire… et qui lit qui.

HELP :slight_smile:

_my_diet ( pas encore avec FormHelper ou FormTagHelper )

Vegetarien Vegetalien Canibale ...

le javascript

oa = new Oajax();
o = oa.createOajax();

function sendQ(){
for( i=1 ; i<=3 ; i++ ){
if( this.document.getElementById(“f”).regime.options[i - 1].selected
){
this.o.open(‘get’, ‘diet?ou=’+i, true);
this.o.onreadystatechange = helpQ;
this.o.send(null);
}
}
}
function helpQ(){
if (o.readyState == 4){ document.getElementById(“bj”).innerHTML =
o.responseText; }
}

le ruby

#~ fxri irb:session:1
#~ first:part:paste
require ‘uri’
require ‘net/http’

#~ model test
class Lifestyle
@@diets = { :veran => ‘vegetarian’, :vegan => ‘vegetalian’, :cani =>
‘cannibal’ }

def initialize(style = :style)
@style = style
end

def diet
@@diets[@style]
end
end
#~ => nil

#~ second part:paste
#~ :controller => ‘lifestyle’, => :action ‘diet’

h = URI::HTTP.build(:scheme => ‘http’, :host=> ‘localhost’, :port =>
‘3000’, :path => ‘/lifestyle/diet’, :query => ‘ou=2’)
#~ => #<URI::HTTP:0x62e916c
URL:http://localhost:3000/lifestyle/diet?ou=2>

@s = URI(“#{h}”).query.slice(3,2)
#~ => “2”
#~ variant @s =
URI.split(“#{h}”)[7].slice(3,2)

case @s #~ => “2”
when 1.to_s #~ /\w*[ou]?[0-1]$/
@diet = Lifestyle.new(:veran).diet
when 2.to_s #~ /\w*[ou]?[1-2]$/
@diet = Lifestyle.new(:vegan).diet
when 3.to_s #~ /\w*[ou]?[2-3]$/
@diet = Lifestyle.new(:cani).diet
else
@diet = “Tripple fok”
end #~ => in this case “vegetalian”

@diet + @s     #~ => "vegetalian2" temporary help me to see the @s 

value in the .erb → vegetalian 2
#~ end controller

h  #~ => #<URI::HTTP:0x630eb24 

URL:http://localhost:3000/lifestyle/diet?ou=2>
@diet #~ => “vegetalian”
@s #~ => “2”

Désolée j’ai eut un souci d’édition

Je voulais changer le titre en minuscule et point reposter mon long post

Houlà , ça m’a l’air un peu emmêlé tout ça, mais au moins ça fait plaisir
d’avoir quelqu’un qui pose une question avec des informations précises
et
des bouts de code.

Déjà , en regardant ton bout de code JavaScript, une question me saute au
neurone : pourquoi faire du JavaScript hardcore comme ça ? Ce serait
plus
simple en utilisant un bon petit framework (si tu ne veux pas trop
t’éloigner de Rails : prototype ; sinon je te recommande le bien
meilleur et
plus simple jQuery). Utiliser une framework t’évitera de tomber dans les
nombreux nids-de-poule que l’AJAX réserve au débutant, et accroîtra ta
productivité.

Par exemple, essayons de traduire le bout de code JavaScript que tu nous
a
posé là en jQuery :
function sendQ() {
var selected = $(‘#f’).value() // récupère le select dont l’id est “f”
et
lit la valeur sélectionnée
$(‘#bj’).load(‘/diet’, { ‘ou’: selected }); // fait une requête AJAX
vers
l’url /diet en méthode get avec la valeur selected dans le paramètre
‘où’ et
injecte le résultat dans l’élément dont l’id est ‘bj’
}

Ca peut aussi marcher avec prototype mais c’est plus compliqué à écrire.
Pour toute information sur jQuery : http://jquery.com/ (oh surprise)

Généralement les problèmes AJAX proviennent de :

  • JavaScript mal écrit (très probable) - utiliser de bons outils
    (Firefox
    avec Firebug) pour les résoudre à posteriori, utiliser de bons outils
    (jQuery, prototype, mootools, etc.) pour les éviter à priori
  • CSS mal écrite (probable) - utiliser de bons outils (Firefox avec
    Firebug) pour les résoudre à posteriori, ne pas promettre la lune
    pour ne
    pas se faire piéger par l’incompatibilité des navigateurs (Internet
    Explorer)
  • problème côté serveur (moins probable) - vérifier que l’on a pas
    oublié
    un respond_to ou une vue spécifique, ou si on a oublié de zapper le
    layout

Sinon je vais jeter un coup d’oeil plus précis sur ton code pendant la
soirée, voir si je vois un autre problème que JavaScript.

Michel B.

2009/9/24 Emma N. [email protected]

Ce que j’entends par là , c’est que sur mon port 3000 localhost mozilla
firefox,
ma selct option ajx fonctionne niquelle, l’action aussi si je mets le
code tel quel avec la fausse url, sauf, que j’ai toujours la value 2,
vue que c’est une fausse url, je sais pas comment parser la requête
entrante :slight_smile:

Pour le code Ruby, ça va me prendre plus de temps pour relire d’où mon
encouragement à commencer par t’intéresser au JavaScript entre temps.

Ceci dit, si tu as peur que jQuery soit trop hardcore, je peux dors et
déjÃ
te rassurer : la doc est super claire, les tutoriels sont simples et
sympa
et permettent d’être rapidement à l’aise passé la surprise de
l’architecture
(l’architecture de jQuery est surprenante, mais elle est géniale), et
surtout le “vocabulaire” de jQuery est très simple (comparé à prototype)
et
s’appuie beaucoup sur les css pour sélectionner des éléments dans la
page (
$(#id_de_mon_element’) c’est quand même plus simple à écrire et sympa Ã
lire
que document.getElementById(‘id_de_mon_element’), et pour un sélecteur
un
peu compliqué genre $(‘#menu > li.selected > a’) sans jQuery j’ose même
pas
imaginer sans jQuery ).

Donc pour le code Ruby à suivre, dès que j’ai eu le temps de lire le
code on
en cause.

Michel B.

2009/9/24 Emma N. [email protected]

comment on édite un message ???

L’action et le controller ça fonctionne avec ma fausse url construite et
passé dans h

quand je clique sur ma select et choisi, j’ai YEP vegetarien 2 qui
s’affiche à coté,

Si je change à la mano la valeur de ou=2 en ou=3

bah ça fonctionne, ça affiche YEP Canibale 3

comme si j’avais fait un formulaire qui met “complete” quand onchange
sauf que là c’est un délire pour tester j’ai mis n’importe quoi comme
options :slight_smile:

On n’édite pas un message, c’est un email sur la mailing list… ^^°

Michel B.

2009/9/24 Emma N. [email protected]

Michel B. wrote:

Houlà , ça m’a l’air un peu emmêlé tout ça, mais au moins ça fait plaisir
d’avoir quelqu’un qui pose une question avec des informations précises
et
des bouts de code.

Déjà , en regardant ton bout de code JavaScript, une question me saute au
neurone : pourquoi faire du JavaScript hardcore comme ça ? Ce serait
plus
simple en utilisant un bon petit framework (si tu ne veux pas trop
t’éloigner de Rails : prototype ; sinon je te recommande le bien
meilleur et
plus simple jQuery). Utiliser une framework t’évitera de tomber dans les
nombreux nids-de-poule que l’AJAX réserve au débutant, et accroîtra ta
productivité.

Par exemple, essayons de traduire le bout de code JavaScript que tu nous
a
posé là en jQuery :
function sendQ() {
var selected = $(‘#f’).value() // récupère le select dont l’id est “f”
et
lit la valeur sélectionnée
$(‘#bj’).load(‘/diet’, { ‘ou’: selected }); // fait une requête AJAX
vers
l’url /diet en méthode get avec la valeur selected dans le paramètre
‘où’ et
injecte le résultat dans l’élément dont l’id est ‘bj’
}

Ca peut aussi marcher avec prototype mais c’est plus compliqué à écrire.
Pour toute information sur jQuery : http://jquery.com/ (oh surprise)

Généralement les problèmes AJAX proviennent de :

  • JavaScript mal écrit (très probable) - utiliser de bons outils
    (Firefox
    avec Firebug) pour les résoudre à posteriori, utiliser de bons outils
    (jQuery, prototype, mootools, etc.) pour les éviter à priori
  • CSS mal écrite (probable) - utiliser de bons outils (Firefox avec
    Firebug) pour les résoudre à posteriori, ne pas promettre la lune
    pour ne
    pas se faire piéger par l’incompatibilité des navigateurs (Internet
    Explorer)
  • problème côté serveur (moins probable) - vérifier que l’on a pas
    oublié
    un respond_to ou une vue spécifique, ou si on a oublié de zapper le
    layout

Sinon je vais jeter un coup d’oeil plus précis sur ton code pendant la
soirée, voir si je vois un autre problème que JavaScript.

Michel B.

2009/9/24 Emma N. [email protected]

Bonsoir et merci beaucoup de votre réponse,

En fait je suis certaine que si l’on refactorise les fonction js en jq,
ça va jouer,
le souci c’est le traitement de ma requête dans mon code ruby du
controller …

le java est neutre,
en revanche oui il me semble que ça a l’air plus sympa les framework,
mais pour les utiliser faut savoir les lire, pour les lire faut savoir
écrire et pour écrire du javascript raccourci et apprendre les classes
du framework me semblen tout aussi hardcore pour moi tout au début
:blush:

:slight_smile:

Moi aussi je vais jetter un coup d’aoil sur la doc pour voir si comment
je peux m’éconnomiser des lignes de code et faire moins “old school”
YEP :slight_smile:
Au fait il manque le diet.erb mais y’ a que le yieldage dedans pour la
span bj

Alors, après lecture du code Ruby et du message, c’est toujours aussi
obscur.

En gros, tu essaye de charger en AJAX le résultat d’une action de ton
contrôleur, l’action utilise un case, le case fournit le bon résultat,
le
résultat arrive en AJAX comme prévu. Où est le problème du coup ?

Michel B.

2009/9/24 Emma N. [email protected]

Michel B. wrote:

Pour le code Ruby, ça va me prendre plus de temps pour relire d’où mon
encouragement à commencer par t’intéresser au JavaScript entre temps.

Ceci dit, si tu as peur que jQuery soit trop hardcore, je peux dors et
déjÃ
te rassurer : la doc est super claire, les tutoriels sont simples et
sympa
et permettent d’être rapidement à l’aise passé la surprise de
l’architecture
(l’architecture de jQuery est surprenante, mais elle est géniale), et
surtout le “vocabulaire” de jQuery est très simple (comparé à prototype)
et
s’appuie beaucoup sur les css pour sélectionner des éléments dans la
page (
$(#id_de_mon_element’) c’est quand même plus simple à écrire et sympa Ã
lire
que document.getElementById(‘id_de_mon_element’), et pour un sélecteur
un
peu compliqué genre $(‘#menu > li.selected > a’) sans jQuery j’ose même
pas
imaginer sans jQuery ).

Donc pour le code Ruby à suivre, dès que j’ai eu le temps de lire le
code on
en cause.

Michel B.

2009/9/24 Emma N. [email protected]

ça a l’air intéressant pour faire des pages valides w3c strict sans
utiliser l’attribut name sur la balise form yEP

et merci bien !
zepo