【问题标题】:ActionMailer instance method being used like class method像类方法一样使用 ActionMailer 实例方法
【发布时间】:2017-09-08 05:12:05
【问题描述】:

这是 ActionMailer 指南中的简短 sn-p

    class UserMailer < ActionMailer::Base
  default :from => "notifications@example.com"

  def welcome_email(user)
    @user = user
    @url  = "http://example.com/login"
    mail(:to => user.email,
         :subject => "Welcome to My Awesome Site")
  end

end

在控制器中

class UsersController < ApplicationController
  # POST /users
  # POST /users.xml
  def create
    @user = User.new(params[:user])

    respond_to do |format|
      if @user.save
        # Tell the UserMailer to send a welcome Email after save
        UserMailer.welcome_email(@user).deliver

        format.html { redirect_to(@user, :notice => 'User was successfully created.') }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
end

那么为什么 Rails 试图将 ruby​​ist 与实例方法混淆为类方法呢?我认为他们已经覆盖了缺失的方法,但这只会让人感到困惑!还是我在这里遗漏了什么?

即为什么不将welcome_email 定义为def self.welcome_email(user)

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    如果是#self.welcome_email,你必须自己创建一个类的实例,这需要对所有默认参数等进行一些配置。Rails 只是提供同名的工厂方法。

    快速浏览一下源代码,你是对的,它似乎确实使用了method_missing,邮件程序实际上是通过以下方式创建的:

    mailer = TheMailer.new(:welcome_email, *args)

    Rails 做了很多这样的“巫术”事情,通常只是为了节省您编写的代码量。仅将 #welcome_email 更改为类方法不会给您实例。

    【讨论】:

    • 那么在调用邮件程序时,rails 应该继续在方法名称前添加“create”或“deliver”。弃用那些 (Rails3) 支持疯狂的 vudoo 只会创建疯狂的 vudoo 开发人员,他们认为他们知道 ruby​​,但实际上他们并不了解
    • 您是否有任何问题,或者只是想表达您的意见? ;) 似乎您创建了一个带有反问的主题,您实际上不应该这样做并且可能会被关闭。
    • 这是一个问题 - 但基于它的“巫毒”而不是一些真正的逻辑原因的答案 - 我想它看起来确实无关紧要。
    猜你喜欢
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2013-06-04
    • 2012-03-24
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多