ruby-on-rails - 当邮件程序未被定义时,您如何在邮件程序上调用类方法?

标签 ruby-on-rails ruby class-method instance-methods

在 Rails 中发送邮件时,通常会做这样的事情:

UserMailer.password_reset(user).deliver

但是如果我们查看 UserMailer 内部,我们可以看到:

def password_reset(user) # not self.password_reset
  # ...
end

注意方法名没有前缀self。看着它,似乎您需要先实例化对象,如下所示。 Rails 如何做到这一点?

UserMailer.new.password_reset(user).deliver

最佳答案

这是一个很好的问题。在源代码 ( https://github.com/rails/rails/blob/master/actionmailer/lib/action_mailer/base.rb ) 中,Rails 使用 method_missing 创建 ActionMailer 的新实例。以下是来源的相关摘录:

def method_missing(method_name, *args) # :nodoc:
  if respond_to?(method_name)
    new(method_name, *args).message
  else
    super
  end
end

关于ruby-on-rails - 当邮件程序未被定义时,您如何在邮件程序上调用类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17088619/

相关文章:

gsub 中的 Ruby 正则表达式捕获组

python - 如何使用 python-decorator 包来装饰类方法?

c++ - 在 C++ 中使用线程调用方法

javascript - 在 HAML 中包含 CSS 和 Javascript 的缺点

ruby-on-rails - 如何在后台添加视频以进行设备 Controller 注册?

ios - Rails Devise Api + Facebook iOS SDK,安全问题

ruby - 在 Ruby shell 脚本中运行 OS X `say` 命令而不退出

ruby-on-rails - 需要编程方法来检测 has_many 和 has_one 关系

Ruby 或 Bash 或 Grep 正则表达式不适用于 '?',即前一个字符出现 0 次或 1 次

python - 如何从基类引用 Python 派生类的 __init__ 方法?