我的模特课:
class item
attr_accessor :item_name
attr_accessor :item_url
attr_accessor :item_label
.
.
end
当我想为这些属性分配值时。逐个分配,即item.item_name="abc"
。
我想将所有属性放在带有硬编码名称的循环中,并为其他来源分配表单。
['item_url','item_url','item_label'].each do |attr|
item.attr=values from some other source #error on this line
#or
item."#{attr}"=values from some other source #error on this line
end
他们两个都没有工作。欢迎任何建议
答案 0 :(得分:3)
你可以这样做:
item.send((attr + "="), values from some other source)
或:
hash = {}
['item_url','item_url','item_label'].each do |attr|
hash[attr] = value
end
item.attributes = hash
答案 1 :(得分:1)
答案 2 :(得分:1)
attr_accessor为每个以setter方法给出的属性定义#attr=
。例如,您可以使用#item_name=
为item_name分配值。要在给定方法名称的字符串或符号的情况下调用实例上的方法,请在实例上调用__send__
。
['item_url','item_url','item_label'].each do |attr|
item.__send__("#{attr}=", value)
end
send
也有效,但我更喜欢__send__
因为send
更有可能被意外覆盖。