JeuWeb - Crée ton jeu par navigateur
Rails, Ajax et éditeur de cartes - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Rails, Ajax et éditeur de cartes (/showthread.php?tid=5157)

Pages : 1 2 3


RE: Rails, Ajax et base de données - Sephi-Chan - 09-09-2010

Oui Popayan, c'est vide. Tu peux mettre des trucs si tu veux dedans, mais généralement ce sera mieux en utilisant les images de fond. Smile

Niahoo, dans mon cas, on ne récupère pas les données : c'est le serveur qui génère du Javascript prêt à l'emploi et Prototype l'interprète car quand la réponse du serveur a un Content-Type propre à Javascript, il sait qu'il doit évaluer la réponse (mais — même si ça n'a pas de sens — on peut forcer l'option evalJS à false dans la requête).

L'autre solution est de renvoyer du JSON et de "construire" le HTML côté Javascript, dans le onSuccess de la requête Ajax, c'est un poil plus économique en bande passante mais c'est moins simple et ça cause des duplications de code.


Sephi-Chan


RE: Rails, Ajax et base de données - niahoo - 09-09-2010

oui c'est chiant de générer du HTML en javascipt. je l'ai eu fait sur mon site consacré à eve online, en plus j'apprenais jQuery donc c'est des document.createElement() mélangés à des $('...').inner('<table>blabla</table>');

la honte quoi. mais bon ça tourne parfaitement.

Cool le coup du content type, ça fonctionne uniquement avec prototype ou tu sais si jquery le fait aussi ?

donc si j'ai bien pigé, si je réponds à ma requete ajax comme ceci :
Code PHP :
<?php
header
('content-type: text/javascript');
echo
"alert('hello');";

l'alert() sera exécutée simplement par l'appel de

Code :
new Ajax.Request(tileUrl, {
        method:      "put",
        contentType: "text/javascript",
        parameters:  parameters
      });

c'est pratique Big Grin


RE: Rails, Ajax et base de données - popayan - 09-09-2010

Ok, mais comme je n'ai pas encore fait de css pour cette appli... je rajoute juste "= image_tag("terrains/#{tile.tile_type.terrain}.png")" dans _tile.html.haml et ca sera déja pas mal Smile

Sinon, ca commence à ressembler à quelque chose Smile
Me reste un problème de route: quand je dépose une tuile sur une case, dans ma console du server j'ai:

Code :
Started POST "/maps/1/tiles/3.js" for 127.0.0.1 at ....

ActionController::RoutingError (No route matches "/maps/1/tiles/3.js"):



RE: Rails, Ajax et base de données - Sephi-Chan - 09-09-2010

Je ne suis pas sûr que jQuery fasse ça. En général je fais :


$.ajax({
url: url,
type: 'PUT'
dataType: 'script',
...
});


Et le plus souvent, je construis le HTML côté serveur. Ça produit une réponse un peu plus lourde mais mon code reste DRY.


html_for_tile = escape_javascript(render('tile', :map => @map, :tile => @tile))

:plain
var tile = $('#{@tile.id}');
tile.html('#{html_for_tile}'); // Avec jQuery, seul le html() change par rapport au insert() de Prototype.


Sephi-Chan


RE: Rails, Ajax et base de données - popayan - 10-09-2010

Après 1 bonne soirée de recherche, je suis toujours coincé sur cette erreur de route... je pense que ca devrait appeller l'action update, mais même avec tous mes essais rien ne fonctionne...


RE: Rails, Ajax et base de données - Sephi-Chan - 10-09-2010

C'est normal. Regarde la sortie de ta commande rake routes. Et colle là ici (j'insiste :p). Puis compare-la avec le log de l'appel Ajax que tu nous a collé :

Citation :Started POST "/maps/1/tiles/3.js" for 127.0.0.1 at ....

ActionController::RoutingError (No route matches "/maps/1/tiles/3.js"):

Pour exécuter l'action update, il faut que la méthode soit PUT ! Smile

Normalement le code que je t'ai donné pour lancer la requête Ajax utilise bien la méthode PUT. Cf. la documentation de Prototype :

Citation :method (String; default post): The HTTP method to use for the request. The other common possibility is get. Abiding by Rails conventions, Prototype also reacts to other HTTP verbs (such as put and delete) by submitting via post and adding a extra _method parameter with the originally-requested method.


Sephi-Chan


RE: Rails, Ajax et base de données - popayan - 10-09-2010

ben justement, j'ai bien la ligne qui devrait correspondre
( map_tile PUT /maps/:map_id/tiles/:id(.:format) { :action=>"update", :controller=>"tiles" } )

reste à voir pourquoi j'ai un POST au lieu d'un PUT?


RE: Rails, Ajax et base de données - Sephi-Chan - 10-09-2010

Parce que ta requête Ajax foire. C'est côté Javascript qu'il faut chercher. Smile
Essaye en mettant manuellement la méthode à utiliser (mais d'après la documentation, c'est ce que Prototype devrait faire…) :


$$(".tile").each(function(tile){
Droppables.add(tile.id, {
onDrop: function(tool, tile, event){
var tileUrl = tile.getAttribute('data-url') + ".js";
var tileTypeId = tool.getAttribute('id');
var parameters = {
_method: "PUT",
tile: {
tile_type_id: tileTypeId
}
};

new Ajax.Request(tileUrl, {
method: "post",
contentType: "text/javascript",
parameters: parameters
});

event.preventDefault();
}
});
});


Sephi-Chan


RE: Rails, Ajax et base de données - popayan - 10-09-2010

toujours la même chose... j'avais bien vu la doc de prototype.
j'ai essayé en enlevant le method: "post" mais ca ne change rien.


edit:

trouvé : https://prototype.lighthouseapp.com/projects/8886/tickets/289-allow-put-delete-and-other-http-methods-on-ajax-requests

par contre, j'ai encore une erreur 'undefined local variable or method 'html_for_tile''


RE: Rails, Ajax et base de données - Sephi-Chan - 10-09-2010

Essaye d'ajouter un filtre pour afficher les paramètres reçus :


class TilesController < ApplicationController
before_filter :raise_parameters

def raise_parameters
raise params.to_yaml
end

# Reste du contrôleur…
end


Sephi-Chan