我得到了:
syntax error, unexpected '=', expecting keyword_end diamond.send(field) = fields[field]
但我不明白为什么。我正在尝试动态分配值。
以下是代码:
def self.import(file)
CSV.foreach(file.path, headers: true) do |row|
diamond = find_by_id(row["id"]) || new
fields = row.to_hash
# assign non float attributes to columns
['cust_ref', 'ags_1st_number', 'ags_ending_number', 'gold_cut_grade',
'polish_grade', 'symmetry_grade', 'color_grade', 'fluor_desc',
'clarity_grade', 'girdle_min_max_percentage', 'diameter_min_max',
'girdle_condition', 'proportion_grade', 'comment_1', 'comment_2',
'comment_3', 'comment_4', 'is_non_ideal', 'key_to_symbols', 'shape'].each do |field|
diamond.send(field) = fields[field]
end
end
end
答案 0 :(得分:4)
那是因为你是在呼唤吸气者,而不是召唤者。
要使用send
,您需要区分attr_accessor的给定方法。
所以,例如:
class Test
attr_accessor :field
end
t = Test.new
t.send(:field)
#=> nil
t.send(:field=, 'lalala')
#=>'lalala'
t.send(:field)
#=>'lalala'
这也适用于字符串。
[编辑]如@jordan所述,这也允许你使用或不使用符号进行字符串插值。 所以下一行也可行:
a = 'field='
t.send(:"#{a}", 'lalala')
t.send(a)
b = 'field'
t.send("#{b}=", 'lalala')
等等。
答案 1 :(得分:1)
您提出的语法不是Ruby中的有效赋值语法。
您可以在Ruby中定义赋值方法(检查http://joeyates.info/2012/01/16/ruby-bareword-assignment-and-method-calls-with-implicit-self/以获得更深入的赋值说明)。
class Diamond
def proportion_grade=(arg)
@proportion_grade = arg
end
end
如果您声明了一个attr编写器或访问器,那么这就是为您完成的
class Diamond
attr_accessor :proportion_grade
end
所以你要调用的方法是方法proportion_grade=
,而不是proportion_grade
正确的方法是:
['all', 'those', 'arguments'].each do |field|
diamond.send("#{field}=", fields[field])
end
答案 2 :(得分:0)
似乎diamond.send(field)
是一个方法,你不应该像处理声明的变量那样处理方法调用。如果要将fields[field]
保存为变量,请声明另一个变量。从行中删除“= fields [field]”,然后将diamond.send(field)
放在自己的行上,或者按@Arup Rakshit放置diamond.send(field + '=' + fields[field])
。