Ruby on Rails/Devise-如何将Registrations#Create中的变量传递给Mailer



我想将会话数据从Registrations控制器传递到我的自定义mailer,这在create操作中触发。我可以使用全局变量来实现这一点,但我非常不愿意走这条路。我想要传递的数据存储在welcome_email_token变量中。

registrations_controller.rb:

module Users
class RegistrationsController < Devise::RegistrationsController
before_action :configure_sign_up_params, only: [:create]
def create
client_with_valid_email_token = Client.registerable_email_token(session[:email_token])
if client_with_valid_email_token.first.present?
welcome_email_token = client_with_valid_email_token.first.email_token
super
end
end
protected
def configure_sign_up_params
devise_parameter_sanitizer.permit(:sign_up, keys: [:attribute])
end
end
end

customer_mailer.rb:

class CustomMailer < Devise::Mailer
helper :application
include Devise::Controllers::UrlHelpers
default template_path: 'devise/mailer'
def confirmation_instructions(record, token, opts = {})
client = Client.find_by(email_token: welcome_email_token)
@first_name = client.first_name
super
end
end

写入的代码为user返回nil,导致user.first_name抛出错误。有没有一种方法可以在不使用全局变量的情况下将这些信息传递给邮件程序?

我想您要查找的记录已经作为该方法的第一个参数传递。如果你对方法的改变如此之少,为什么只使用Devise已经提供的标准方法呢?

class CustomMailer < Devise::Mailer
helper :application
include Devise::Controllers::UrlHelpers
default template_path: 'devise/mailer'
def confirmation_instructions(record, token, opts = {})
@user = record
super
end
end

super基本上也在调用Devise的原始confirmation_dinstructions方法,即:

def confirmation_instructions(record, token, opts={})
@token = token
devise_mail(record, :confirmation_instructions, opts)
end

它使用了一种叫做设计电子邮件的辅助方法:

# Configure default email options
def devise_mail(record, action, opts = {}, &block)
initialize_from_record(record)
mail headers_for(action, opts), &block
end

所以我真的看不出你想在你的方法中实现什么,这还没有被Devise处理。

最新更新