Frage

Ich habe einen Artikel ActiveRecords Und ich versuche, einen Standardwert ("Testelement") für jeden von ihnen mit einem Block festzulegen.
In diesem Ausdruck:

list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.attributes["#{name}"] = "Test item"] }

Werte werden nicht festgelegt.

Ich muss benutzen @item.attributes["#{name}"] Für die Interpolation, weil ich dies nicht für jeden Artikel tun kann:

@item.tipe1 = "Test item"

Was passiert also in der ersten Aussage? Wieso den? Wenn das, was ich tun möchte, auf diese Weise nicht möglich ist, wie kann ich das Gleiche tun?

War es hilfreich?

Lösung

Die Zuordnung @items.attributes["#{name}"] = "Test item"] funktioniert nicht, weil die attributes Die Methode gibt jedes Mal, wenn Sie es aufrufen, ein neues Hash -Objekt zurück. Sie ändern also nicht den Wert der @items'Objekt, wie du gedacht hast. Stattdessen ändern Sie den Wert des neuen Hashs, der zurückgegeben wurde. Und dieser Hash ist nach jeder Iteration verloren (und natürlich, wenn die each Block ist fertig).

Eine mögliche Lösung wäre, einen neuen Hash mit den Schlüssel der Tasten zu erstellen @items'Attribute und zuweisen dies über die attributes= Methode.

h = Hash.new

# this creates a new hash object based on @items.attributes
# with all values set to "Test Item"
@items.attributes.each { |key, value| h[key] = "Test Item" }

@items.attributes = h

Andere Tipps

Sie können die Send -Methode für diesen Zweck verwenden. Vielleicht so:

list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.send("#{name}=", "Test item") }

Ich denke, das Problem ist, dass Sie nur das zurückgegebene Attribut -Hash, nicht das ActivereCord -Objekt, ändern.

Sie müssen so etwas tun wie:

# make hash h
@items.attributes = h

Befolgen Sie Ihr Beispiel vielleicht so etwas wie:

@items.attributes = %w{type1 type2 type3 type4}.inject({}) { |m, e| m[e] = 'Test item'; m }

Übrigens, "#{e}" ist dasselbe wie der String -Ausdruck e oder für einen Typ: e.to_s. Ein zweites Beispiel, vielleicht einfacher zu lesen:

a = %w{type1 type2 type3 type4}
h = {}
a.each { |name| h[name] = 'test item' }
@items.attributes = h

Verwendung der attributes= Die Methode ist wahrscheinlich für Hash -Konstanten bestimmt, wie:

@items.attributes = { :field => 'value', :anotherfield => 'value' }

Für vollständig generierte Attribute könnten Sie nehmen Dannemannes Vorschlag und verwenden Sie SEND.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top