在 rails 中干掉方法调用

DRYing up method calls in rails

我有一个方法类型相似的代码header。我通过每次定义新的 def 并使用 If..else 条件来调用每个方法。

def main_fun(data)
    id = data[0]
    day = data[1]
    if day === 1
      fun1(id)
    elsif day === 2
      fun2(id)
    elsif day === 3
      fun3(id)
    end
end

def fun1(id)
    SomeClass::Mailer.fun_1days(id).deliver_now
end

def fun2(id)
    SomeClass::Mailer.fun_2days(id).deliver_now
end

def fun3(id)
    SomeClass::Mailer.fun_3days(id).deliver_now
end

# have to add more methods for (4,5,6...) in future.

你能帮我吗干掉这些方法调用这样我就可以用最少的更新添加新方法?

这里的主要问题是邮件程序的体系结构 class 和方法。您真的需要三种不同的邮件方式吗?还是可以将其干燥?

你可以传入天数和模板名称

class Mailer < ApplicationMailer
  def fun(id, day_count)
    user = User.find(id)
    template = "fun_#{day_count}days"

    mail(:to => "#{@user.name} <#{@user.email}>", 
     :subject => "Fun #{days}", 
     :template_name => template)
  end
end

在你的主要功能中你可以做

def main_fun(data)
  id = data[0]
  day = data[1]
    
  Mailer.fun(id, day).deliver_now
end

send / public_send 这样的元编程是一个强大的工具,如果你开发一个例如库,但在这种情况下,它使代码更难理解和维护。此更改还使代码更易于扩展。如果你想引入一个 4 天的邮件,你只需要为它添加另一个模板,而不需要在邮件程序中 c&p 另一个方法 class.