使用class_eval覆盖关联

时间:2012-07-30 11:01:52

标签: ruby ruby-on-rails-3 metaprogramming

我有一个Message模型,它具有以下关系:

belongs_to :sender, Class: "User"
belongs_to :recipient, Class: "User"

在某些情况下,我试图使用class_eval覆盖收件人方法。

这有效:

def update_recipient(message, recipient_addition = nil)
  message.class_eval <<-EVAL
    def recipient
      "test"
    end
  EVAL
end

message.recipient =&gt; “测试”

然而,这不是:

def update_recipient(message, recipient_addition = nil)
  message.class_eval <<-EVAL
    def recipient
      [#{message.recipient}, #{recipient_addition}]
    end
  EVAL
end

(eval):3: syntax error, unexpected keyword_end, expecting ']'

1 个答案:

答案 0 :(得分:1)

第一个#被误解为注释字符,丢弃了该行的其余部分。 #{}预计将在双引号内插入,但似乎没有理由将它们放在#{}中,因为它们只是简单的字符串值。

["#{message.recipient}", "#{recipient_addition}"]

......除非你计划的事情如下:

["To: #{message.recipient}", "CC: #{recipient_addition}"]