Rails语法错误,但为什么呢?

时间:2014-07-01 18:28:37

标签: ruby-on-rails ruby

我得到了:

 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

3 个答案:

答案 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])