4

アイテムがActiveRecordsあり、ブロックを使用してそれぞれにデフォルト値(「テストアイテム」)を設定しようとしています。
この式では:

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

値が設定されていません。

@item.attributes["#{name}"]すべてのアイテムに対してこれを行うことはできないため、補間に使用する必要があります。

@item.tipe1 = "Test item"

では、最初のステートメントで何が起こりますか?なんで?私がやりたいことがそのように不可能な場合、どうすれば同じことができますか?

4

3 に答える 3

2

この目的のためにsendメソッドを使用できます。おそらくこのように:

list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.send("#{name}=", "Test item") }
于 2011-01-21T02:09:34.617 に答える
2

メソッドは、呼び出すたびに新しいハッシュオブジェクトを返すため、割り当て@items.attributes["#{name}"] = "Test item"]は機能しません。attributesしたがって、@items'オブジェクトの値を思ったように変更しているわけではありません。代わりに、返された新しいハッシュの値を変更しています。そして、このハッシュは各反復後(そしてもちろんeachブロックが終了したとき)に失われます。

考えられる解決策は、'属性のキーを使用して新しいハッシュを作成し、メソッド@itemsを介してこれを割り当てることです。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
于 2011-01-21T02:40:27.167 に答える
1

問題は、ActiveRecord オブジェクトではなく、返された属性ハッシュのみを変更していることだと思います。

次のようなことをする必要があります:

# make hash h
@items.attributes = h

あなたの例に従って、おそらく次のようなものです:

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

ところで、文字列式または任意のタイプ"#{e}"と同じです: . おそらく読みやすい2番目の例:ee.to_s

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

メソッドの使用attributes=は、おそらく次のようなハッシュ定数を対象としています。

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

完全に生成された属性については、DanneManne の提案を利用して send を使用できます。

于 2011-01-21T02:03:04.820 に答える