Ruby on Rails 项目,我正在运行 Resque 来处理电子邮件(特别是 Devise 和 Devise Invitable)。设计电子邮件发送良好(通过 API 通过邮戳 gem 发送)但 devise_invitable 电子邮件在 Resque 中失败,带有undefined me,ruby-on-rails,devise,resque,devise-invitable,apartment-gem"/>

首页 > 解决方案 > 设计 Invitable 的 Resque 作业失败 - 未定义的方法 `invitation_instructions' 用于#

Ruby on Rails 项目,我正在运行 Resque 来处理电子邮件(特别是 Devise 和 Devise Invitable)。设计电子邮件发送良好(通过 API 通过邮戳 gem 发送)但 devise_invitable 电子邮件在 Resque 中失败,带有undefined me

问题描述

Ruby on Rails 项目,我正在运行 Resque 来处理电子邮件(特别是 Devise 和 Devise Invitable)。设计电子邮件发送良好(通过 API 通过邮戳 gem 发送)但 devise_invitable 电子邮件在 Resque 中失败,带有undefined method invitation_instructions for #User:0x0xxxxxx Did you mean? invitations_count.

通过默认设计邮件发送时,一切正常,但我的自定义邮件失败。我想添加一个内联附件,因此需要一个自定义邮件。

自定义设计邮件:

class DeviseMailer < Devise::Mailer
    helper  :application

    include Devise::Controllers::UrlHelpers
    include Devise::Mailers::Helpers
    include DeviseInvitable::Mailer

    default template_path: 'devise/mailer'
    default from: sender@example.com
    layout  'mailer_devise'

    before_action :add_inline_attachment!

    def reset_password_instructions(record, token, opts={})
        super
    end

    def invitation_instructions(record, token, opts={})
        @token = token
        devise_mail(record)#, record.invitation_instructions || :invitation_instructions, opts)
      end

    private

    def add_inline_attachment!
        attachments.inline['logo.png'] = File.read(Rails.root.join('app/assets/images/logo.png'))
    end
end

概括:

def reset_password_instructions- 工作正常

def invitation_instructions- 因未定义的方法错误而失败


从您获得令牌的服务中,您可以创建一个在设置令牌时发​​出的主题。

export class AccessTokenService {
  private readonly accessToken = new Subject<string>();
  readonly accessToken$ = accessToken.asObservable();

  constructor() {
    // your logic to get token:
    this.getTokenFromSomewhere().subscribe(() => {
      const token = localStorage.setItem('accessToken');
      this.accessToken.next(token);
    });
  }
}

export class CustomHttpInterceptor implements HttpInterceptor {
  constructor(readonly at: AccessTokenService) {}

  public intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return this.at.accessToken$.pipe(
      mergeMap((token) => {
        const request = request.clone({
          setHeaders: {
            Authorization: `Bearer ${token}`
          }
        });

        return next.handle(request);
      })
    );
  }
}

您还可以在APP_INITIALIZER加载其他任何内容之前使用 设置 localStorage 项。但这取决于您的用例是否现在有用

标签: ruby-on-railsdeviseresquedevise-invitableapartment-gem

解决方案


由于其他原因,我最终迁移到 Sidekiq。下面是我更新的 Devise Mailer 类,它运行良好。没有必要定义invitation_instructions方法,因为before_action回调附加了内联图像,我一开始想要的是什么。

class DeviseMailer < Devise::Mailer
  helper  :application
  include Devise::Controllers::UrlHelpers
  include Devise::Mailers::Helpers
  include DeviseInvitable::Mailer

  default template_path: 'devise/mailer'
  default from: ENV['EMAIL_NAME']
  layout  'mailer_devise'

  before_action :add_inline_attachment!

  private

  def add_inline_attachment!
    attachments.inline['logo.png'] = File.read(Rails.root.join('app/assets/images/logo.png'))
  end
end

推荐阅读