質問

アイテムがあります 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' }

完全に生成された属性については、取得できます ダンネマンヌ 提案と使用の送信。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top