0

我在OrderRails 应用程序的模型中,我希望在其中调用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>

怎么会这样?

4

3 回答 3

4

其他答案涉及逗号,我将解决方法之间的区别。

send当您事先不知道方法名称时调用方法(在“代码编写”时,因为缺少编译时)。或者您确实知道,但是执行“静态”调用会大大增加代码的复杂性(您的情况,有重复的代码)。在这种情况下,需要动态调用 ( send)。

于 2013-05-09T17:00:59.100 回答
3

文字前缀创建一个由空格分隔的%w标记数组。

你有%w(notification, correspondence)其中包括字符串“通知”(注意逗号)和“通信”。

去掉逗号,你应该很好。

于 2013-05-09T17:00:43.923 回答
2

你有一个不需要的逗号

改变

%w(notification, correspondance)

%w(notification correspondance)
于 2013-05-09T17:00:27.840 回答