Wie erstelle ich dynamische IDs in Haml?

74
#item

erstellt ein div mit id = "item"

.box#item

erstellt ein div mit class = "box" und id = "item"

.box#="item "+x

erstellt ein div mit class = "box" und einem Kommentar '# = "item" + x'

.box#
  ="item"+x

löst "Unzulässiges Element: Klassen und IDs müssen Werte haben."

Wie kann ich die ID auf eine Variable setzen?

user225643
quelle

Antworten:

134

Es gibt zwei Möglichkeiten:

Die Langform (definieren Sie die ID als reguläres Attribut):

.box{:id => "item_#{x}"}

produziert dies ( xist was auch immer x.to_sbewertet):

<div class="box" id="item_x">

Die Kurzform:

.box[x]

erzeugt die folgende Annahme, xist eine Instanz von item:

<div class="box item" id="item_45">

Weitere Informationen finden Sie in der HAML-Referenz .

EmFi
quelle
2
Ich musste das Leerzeichen entfernen, damit es funktioniert: .box {: id => "item _ # {x}"}
jethroo
Wie verketten Sie eine Zeichenfolge und eine in Zeichenfolgen konvertierte Variable in der Verknüpfungsmethode? Ich habe versucht .box["item" + s]und Varianten ohne Erfolg. Ist diese Verknüpfung mit eckigen Klammern nur mit Variablen kompatibel?
Ahnbizcad
1
@gwho die Shortcut-Methode erfordert, dass x eine Instanz von item ist. Verwenden Sie das Langform-Zeichenfolgeninterpolationsformular, um das zu erreichen, wonach Sie suchen. .box {: id => "item # {s}"}
EmFi
6

Sie können das idund classin HAML folgendermaßen einstellen

  1. Der normale Weg

    .box.item#item
    
    <div id="item" class="box item"></div>
    
  2. Wenn Sie interpolieren müssen, können Sie dieses Format verwenden

    .box{id: "item_#{123}", class: "item_#{123}"}
    
    <div id="item_123" class="box item_123"></div>
    
  3. Dieses Format generiert die Klasse und die ID unter Verwendung der Objektreferenz

    # app/controllers/items_controller.rb 
    @item = Item.find(123)
    
    .box[@item]
    
    <div id="item_123" class="box item"></div>
    
  4. Wenn Sie etwas voranstellen müssen

    .box[@item, :custom]
    
    <div id="custom_item_123" class="box custom_item"></div>
    
  5. Wenn Sie eine benutzerdefinierte Klassen- und ID-Generierung benötigen, müssen Sie dem Modell die folgende Methode hinzufügen.

    class CrazyUser < ActiveRecord::Base
      def haml_object_ref
        "customized_item"
      end
    end
    

    Und dann erhalten Sie die angepasste Klasse

    .box[@item]
    
    <div id="customized_item_123" class="box customized_item"></div>
    

Verweisen:

Deepak Mahakale
quelle