JeuWeb - Crée ton jeu par navigateur
Rails 3.0 est sorti ! - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Général (https://jeuweb.org/forumdisplay.php?fid=36)
+--- Forum : Blabla (https://jeuweb.org/forumdisplay.php?fid=42)
+--- Sujet : Rails 3.0 est sorti ! (/showthread.php?tid=5130)

Pages : 1 2 3


RE: Rails 3.0 est sorti ! - popayan - 06-09-2010

Sephi, je viens de lire le draft sur Spherium et j'aurais une question:

Dans le helper pour l'affichage de la map, tu utilises la méthode inject. Pourrais tu détailler son fonctionnement? Est-ce normal que je ne trouve pas trace de cette méthode dans les API rails?


RE: Rails 3.0 est sorti ! - Sephi-Chan - 06-09-2010

La méthode inject appartient au module Enumerabe.

Son fonctionnement est un peu étrange au début, l'approche ressemble à de la programmation fonctionnelle. Mais une fois qu'on le connaît (et qu'on pense à s'en servir…), ça devient très pratique. Smile


content_tag(:div, html_attributes) do
ring.spheres.inject('') do |sphere_elements, sphere|
sphere_elements << sphere_tag(sphere)
end
end

Plutôt qu'une explication, je vais te proposer une écriture alternative. Smile


content_tag(:div, html_attributes) do
sphere_elements = ''
ring.spheres.each do |sphere|
sphere_elements << sphere_tag(sphere)
end
sphere_elements
end

En fait, inject permet simplement d'être plus concis.

Voici un billet de blog qui présente des cas d'utilisation de inject : Jay Fields — Ruby inject.


Sephi-Chan


RE: Rails 3.0 est sorti ! - popayan - 06-09-2010

Effectivement, la seconde méthode est plus claire, merci


RE: Rails 3.0 est sorti ! - Sephi-Chan - 06-09-2010

Bof… inject permet d'injecter du contenu (concaténer, additionner, remplacer, etc.) dans une variable mémorisée au fil des itérations. C'est très clair, c'est simplement inhabituel quand on vient d'un autre langage.


Contrairement à la notation suivante, très pratique et lisible avec un peu d'habitude, mais qui n'est pas limpide :


users = User.all

# Je veux récupérer le nom de chaque utilisateur.
names = users.map { |user| user.name } # Forme longue…
names = users.map(&:name) # Forme courte !


Sephi-Chan


RE: Rails 3.0 est sorti ! - Chandler - 09-09-2010

Dis moi Sephi dans ton lien pour les tutoriaux Ruby ce sont les meilleurs selon toi?

Le siteduzero a bonne réputation mais pour Ruby je trouve que le tutoriel est pas clair (surtout destructuré).

EDIT: Ok j'ai pas vu qu'ils étaient de toi, forcément tu vas pas me dire qu'ils sont nuls :$


RE: Rails 3.0 est sorti ! - Thib4s - 09-09-2010

Bah c'est pas a proprement dit un tutorial le Draft hein Big Grin
Sephi montre juste comment il crée son propre jeu en utilisant les meilleurs pratiques possible ^^
En gros c'est observer du bon code, le comprendre et pouvoir l'adpater pour le réutiliser Big Grin
Pour moi une belle mine d'or pour commencer Rails c'est http://railstutorial.org/book


RE: Rails 3.0 est sorti ! - Sephi-Chan - 09-09-2010

Concernant les tutoriels, ils servent juste à présenter le langage, rien d'avancé.
Et pour les drafts, je ne sais pas si ce sont les meilleures pratiques, mais ce sont les miennes du moment. Avec en plus certaines spécificités pour être didactique. ^^


RE: Rails 3.0 est sorti ! - popayan - 01-10-2010

J'aimerai que quelqu'un me donne un éclaircissement sur le callback after_add, j'ai fait


has_and_belongs_to_many :teams, :after_add => Confusedet_statut

def set_statut
if (self.teams.count == 6)
self.update_attribute(Confusedtatut, 1)
self.save
end
end

mais ca n'a pas l'air de faire ce que je voudrais que ca fasse :'(
je ne vois pas dans ma console s'exécuter le count par exemple...


RE: Rails 3.0 est sorti ! - Sephi-Chan - 01-10-2010

Crée plutôt un nouveau sujet pour ce genre de question, assez spécifique. Wink

Je n'utilise pas souvent ces callbacks (ils sont peu utilisés de manière générale, car leur documentation est assez succinte et que leur implémentation initiale était un peu bancale) et je ne peux pas faire de test dans l'immédiat, mais j'ai peut-être des pistes.
Es-tu sûr que self correspond bien à ton objet (je ne sais pas dans quelle classe tu es puisque tu as tronqué ton modèle) ?
La méthode update_attribute effectue une sauvegarde de l'objet, tu n'as pas besoin d'appeler save derrière.

Enfin, cette manipulation devrait plutôt se faire dans le callback after_create de ton modèle de relation, puisque after_add est appelé même si l'association n'est pas sauvegardé en base de données alors que dans l'esprit, tu ne veux passer le status à 1 que si tu as atteint les 6 joueurs. D'ailleurs, je te conseille d'utiliser une constante avec un nom parlant plutôt qu'un nombre (même si cette constante contient en effet un nombre).

Exemple si j'implémentais ça comme je te le conseille (en extrapolant sur les modèles) :


class GameTeam < ActiveRecord::Base

belongs_to :game
belongs_to :team


after_create Confusedet_status


private

def set_status
if game.teams.count == 6
game.update_attribute(Confusedtatus, GAME::STARTED)
end
end

end

Quand je serais chez moi, je ferais quelques essais pour t'indiquer comment ça aurait pu avoir le comportement souhaité.


Sephi-Chan