Ruby on rails 理解Rails ActionMailer编码
我对ActionMailer编码有点困惑 一个标准的ActionMailer示例 app/mailers/example\u mailer.rbRuby on rails 理解Rails ActionMailer编码,ruby-on-rails,ruby,actionmailer,Ruby On Rails,Ruby,Actionmailer,我对ActionMailer编码有点困惑 一个标准的ActionMailer示例 app/mailers/example\u mailer.rb class ExampleMailer < ActionMailer::Base default from: "from@example.com" def sample_email(user) @user = user mail(to: @user.email, subject: 'Sample Email') en
class ExampleMailer < ActionMailer::Base
default from: "from@example.com"
def sample_email(user)
@user = user
mail(to: @user.email, subject: 'Sample Email')
end
end
def create
@user = User.new(user_params)
respond_to do |format|
if @user.save
# Sends email to user when user is created.
ExampleMailer.sample_email(@user).deliver_now
format.html { redirect_to @user, notice: 'User was successfully created.' }
format.json { render :show, status: :created, location: @user }
else
format.html { render :new }
format.json { render json: @user.errors, status: :unprocessable_entity }
end
end
end
我的问题与
ExampleMailer.sample_email(@user).deliver_now
ExampleMailer
访问sample\u email
方法而不使用ExampleMailer.new
<代码>示例\u电子邮件不是类方法立即投递
呼叫示例邮递员
我希望这是清楚的。感谢您的帮助。您是对的,
sample\u email
不是类方法,而是实例方法。但是ExampleMailer
继承了ActionMailer::Base
,它做了一些巧妙的元编程
调用ExampleMailer.simple\u email
时,它找不到类方法,因此会自动调用私有方法method\u missing
在method\u missing
中,它检查实例方法是否存在,创建一个mailer实例对象(因此它基本上为您执行.new
),调用mailer对象上的实例方法,然后返回对象。。。在该对象上,您调用了deliver\u now
或deliver\u later
方法,因为您在原始行中指定了这些方法。基本上和你做的一样
my_mail_thing = ExampleMailer.sample_email(@user)
my_mail_thing.deliver_now
但是,如果ExampleMailer找不到实例方法,它会返回标准的缺失响应,例如“NoMetihodError::undefined method‘other_simple_email’(例如邮件)::Class”
这真是太神奇了。通过谷歌搜索这个术语,你可以阅读更多关于method\u missing
,你还可以在自己的类上进行实验