属性の設定に問題があります
-
15-10-2019 - |
質問
アイテムがあります ActiveRecords
また、ブロックを使用してそれぞれにデフォルト値(「テストアイテム」)を設定しようとしています。
この表現で:
list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.attributes["#{name}"] = "Test item"] }
値は設定されていません。
私は使わなければなりません @item.attributes["#{name}"]
すべてのアイテムに対してこれを行うことができないため、補間のために:
@item.tipe1 = "Test item"
それで、最初の声明で何が起こるのでしょうか?なんで?私がやりたいことがそのように不可能な場合、どうやって同じことをすることができますか?
解決
割り当て @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
他のヒント
この目的のために送信方法を使用できます。おそらくこのように:
list = {"type1", "type2", "type3", "type4", "..."}
list.each { |name| @item.send("#{name}=", "Test item") }
問題は、ActiverCordオブジェクトではなく、返された属性ハッシュのみを変更していることだと思います。
あなたは次のようなことをする必要があります:
# make hash h
@items.attributes = h
あなたの例に従ってください、おそらく次のようなもの
@items.attributes = %w{type1 type2 type3 type4}.inject({}) { |m, e| m[e] = 'Test item'; m }
ところで、 "#{e}"
文字列式と同じです e
または任意のタイプの場合: e.to_s
. 。 2番目の例、おそらく読みやすい:
a = %w{type1 type2 type3 type4}
h = {}
a.each { |name| h[name] = 'test item' }
@items.attributes = h
を使用して attributes=
方法は、おそらく次のようなハッシュ定数を対象としています。
@items.attributes = { :field => 'value', :anotherfield => 'value' }
完全に生成された属性については、取得できます ダンネマンヌ 提案と使用の送信。