我在Rails应用程序的Order
模型中,我希望为Email
类的实例调用方法。
第一种方法采用Email
类的实例(在本例中称为email
)。它运作得很好。
def recursive_search_mails(user, settings)
emails = user.emails.where(:datetime.gte => self.datetime)
emails.each do |email|
notification = email.test_if_notification(user, settings)
if notification == true
email.destroy
return
end
correspondance = email.test_if_correspondance(user, settings)
if correspondance == true
email.destroy
return
end
end
end
以上代码的更简洁版本就是这个:
def recursive_search_mails(user, settings)
emails = user.emails.where(:datetime.gte => self.datetime)
emails.each do |email|
%w(notification, correspondance).each do |type|
is_type = email.send("test_if_#{type}", user, settings)
if is_type == true
email.destroy
return
end
end
end
end
然而,它引发了这个错误:
2013-05-09T16:36:11Z 71266 TID-owr7xy0d0 WARN: undefined method `test_if_notification,' for #<Email:0x007fd3a3ecd9b0>
这怎么可能?
答案 0 :(得分:4)
其他答案涉及逗号,我将解决方法之间的区别。
如果您事先不知道方法名称(在“代码写入时”,因为缺少编译时),则使用send
调用方法。或者您知道,但执行“静态”调用会大大增加代码的复杂性(您的情况,使用重复的代码)。在这种情况下,需要调用动态调用(send
)。
答案 1 :(得分:3)
%w
文字前缀创建一个由空格分隔的标记数组。
您有%w(notification, correspondence)
,其中包含字符串“通知”(记下逗号)和“通信”。
摆脱逗号,你应该很好。
答案 2 :(得分:2)
你有一个不受欢迎的逗号
更改
%w(notification, correspondance)
到
%w(notification correspondance)