2012-07-30 63 views
1

我有一个具有以下关系的消息模型:使用class_eval覆盖关联

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 => “测试”

然而,这并不:

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

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

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

...除非你打算是这样的:

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

什么,在你看来,是返回与用户对象为显示数组的最佳方式? – user577808 2012-07-30 12:58:32

+0

那些看起来像是你正在返回的对象,所以如果你想返回_string_值,可以像'[message.recipient.email,recipient_addition.email]'(假设他们有电子邮件属性)。如果你想返回_objects_,直接通过'[message.recipient,recipient_addition]' – 2012-07-30 13:36:28

+0

直接返回。不幸的是,recipient_addition不在该class_eval块的范围内。 – user577808 2012-07-30 13:51:37