JeuWeb - Crée ton jeu par navigateur
[HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - 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 : [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation (/showthread.php?tid=5775)

Pages : 1 2


[HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Maz - 26-10-2011

Bonjour, j'aimerais ajouter une class css à un bloc dans certains cas, après avoir tergiverser, j'en suis arriver à ceci:

- if @map.tiles[[x,y]].current_user_city?
%g.tuile.current_user_city{:id => "x:#{x}y:#{y}"}
- else
%g.tuile{:id => "x:#{x}y:#{y}"}
%use{:x => @map.tiles[[x,y]].position_on_svg.x, "xlink:href" => "##{@map.tiles[[x,y]].tile_image_id}", :y => @map.tiles[[x,y]].position_on_svg.y}

Comme je pouvais m'y attendre, la balise use, n'est pas contenu par le bloc "g". Si je rajoutes une indentations, elle est incluse dans le else, étant donné qu'après le %use, j'ai encore tout un tas de données à ranger dans "g", copier/coller dans le if et le else ajouterais 20lignes à mon code... stupide.

Quelqu'un aurait-il une idée?


RE: [HAML]Condition sur un bloc parent, les enfants ignorés à cause de l'indentation. - Sephi-Chan - 26-10-2011


%g.tuile{ id: "x#{x}_y#{y}", class: @map.tiles[[x,y]].current_user_city? && "current_user_city" }
%use{ x: @map.tiles[[x,y]].position_on_svg.x,
y: @map.tiles[[x,y]].position_on_svg.y,
"xlink:href" => "##{@map.tiles[[x,y]].tile_image_id}" }

C'est quoi ce @map.tiles[[x,y]] ?


RE: [HAML]Condition sur un bloc parent, les enfants ignorés à cause de l'indentation. - Maz - 26-10-2011

(26-10-2011, 08:50 PM)Sephi-Chan a écrit : C'est quoi ce @map.tiles[[x,y]] ?
@map.tiles est un Hash multi-dimensionel de tiles.


RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Sephi-Chan - 26-10-2011

Ok.

Sinon, pour être plus clair que tu peux définir une variable intermédiaire :


- tile = @map.tiles[[x,y]]
%g.tuile{ id: "x#{x}_y#{y}", class: tile.current_user_city? && "current_user_city" }
%use{ x: tile.position_on_svg.x,
y: tile.position_on_svg.y,
"xlink:href" => "##{tile.tile_image_id}" }


Ou définir un helper pour créer la balise d'une tuile :


# Dans app/helpers/map_helper.rb.
module MapHelper
def tile_tag(tile)
attributes = {
id: "x#{tile.x}_y#{tile.y}",
class: tile.current_user_city? && "current_user_city"
}

content_tag :g, attributes do
content_tag :use, x: tile.position_on_svg.x,
y: tile.position_on_svg.y,
"xlink:href" => "##{tile.tile_image_id}"
end
end
end



RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Maz - 26-10-2011

(26-10-2011, 09:23 PM)Sephi-Chan a écrit : Ou définir un helper pour créer la balise d'une tuile :


# Dans app/helpers/map_helper.rb.
module MapHelper
def tile_tag(tile)
attributes = {
id: "x#{tile.x}_y#{tile.y}",
class: tile.current_user_city? && "current_user_city"
}

content_tag :g, attributes do
content_tag :use, x: tile.position_on_svg.x,
y: tile.position_on_svg.y,
"xlink:href" => "##{tile.tile_image_id}"
end
end
end

Très bonne astuce, merci.



RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Maz - 27-10-2011

Ok, petit coup de gueule u_u:
def tile_tag(tile)
content_tag :g do
content_tag :tspan, "ping"
content_tag :tspan, "pong"
end
end

L'appel de cette méthode affiches:
Citation :<g><tspan>pong</tspan></g>

Je trouves cela vraiment naze et ça vient de me faire perdre 30minutes à piger pourquoi le premier élément n'était pas afficher et ne renvoyer aucune erreur.

Edit: en y réfléchissant, c'est logique, Ruby fait un return du dernier élément, mais c'est quand même naze! Au moins je ferais plus avoir.


RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Sephi-Chan - 27-10-2011

Parce que tu ne connais pas ton Ruby de base. Smile
Un block retourne la dernière expression appelée à l'intérieur.



RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Maz - 27-10-2011

Ouai j'ai pigé après-coup -_- mais bon tu n'aurais pas une autre astuce que celle que j'utilises actuellement à savoir:
def tile_tag(tile)
content_tag :g do
final_content = content_tag(:tspan, "ping")
final_content += content_tag(:tspan, "pong")
end
end
Je trouves ça vraiment moches.


RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Sephi-Chan - 27-10-2011


def tile_tag(tile)
content_tag :g do
content_tag(:tspan, "ping") +
content_tag(:tspan, "pong")
end
end



RE: [HAML] Condition sur un bloc parent, les enfants ignorés à cause de l'indentation - Maz - 27-10-2011

shame on me.