Question

J'ai un ActiveRecords article et je suis en train de définir une valeur par défaut ( « élément de test ») pour chacun d'eux à l'aide d'un bloc.
Dans cette expression:

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

Les valeurs ne sont pas réglées.

Je dois utiliser @item.attributes["#{name}"] pour l'interpolation parce que je ne peux pas le faire pour chaque élément:

@item.tipe1 = "Test item"

Alors, ce qui se passe dans la première déclaration? Pourquoi? Si ce que je voudrais faire est pas possible de cette façon, comment je peux faire la même chose?

Était-ce utile?

La solution

Le @items.attributes["#{name}"] = "Test item"] d'affectation ne fonctionne pas, car la méthode attributes retourne un nouvel objet Hash chaque fois que vous l'appelez. Donc, vous ne changez pas la valeur de l'@items » objet que vous avez pensé. Au lieu de cela, vous changez la valeur de la nouvelle Hash qui a été retourné. Et ce Hash est perdu après chaque itération (et bien sûr lorsque le bloc each a fini).

Une solution possible serait de créer une nouvelle Hash avec les touches du @items » attributs et attribuer ce via la méthode attributes=.

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

Autres conseils

Vous pouvez utiliser la méthode d'envoi à cet effet. Peut-être comme ceci:

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

Je pense que le problème est que vous changez seulement le hachage de l'attribut retourné, et non l'objet ActiveRecord.

Vous devez faire quelque chose comme:

# make hash h
@items.attributes = h

Après votre exemple, peut-être quelque chose comme:

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

BTW, "#{e}" est la même chose que l'expression chaîne e ou pour tout type: e.to_s. Un deuxième exemple, peut-être plus facile à lire:

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

En utilisant la méthode de attributes= est probablement destiné à des constantes de hachage, comme:

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

Pour les attributs entièrement générés, vous pouvez prendre suggestion de DanneManne et d'utiliser le mode.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top