데이터베이스 트랜잭션에서 Rails 메일러 미리보기를 래핑하는 방법

4595 단어 railstutorialruby
오늘날 대부분의 웹 애플리케이션은 일종의 이메일을 보내야 합니다. Ruby on Rails에서 이것은 쉬운 작업입니다. Action Mailer를 사용하고, 이메일 내용을 만들고, SMTP 구성을 설정하기만 하면 준비가 완료됩니다.

이 과정에서 가장 어려운 부분은 콘텐츠 제작입니다. 특히 다국어 응용 프로그램을 빌드하는 경우 소스 코드에서 큰 그림을 보는 것이 매우 어려울 수 있습니다. 다행히도 Rails는 Action Mailer Previews 을 사용하여 이러한 이메일이 웹 브라우저에서 올바르게 보이는지 확인할 수 있는 방법을 제공합니다. ActionMailer::Preview에서 상속하는 클래스를 만들고 필요한 메일러 작업을 호출하기만 하면 됩니다.

# test/mailers/previews/user_mailer_preview.rb

class UserMailerPreview < ActionMailer::Preview
  def confirmation
    user = User.new(email: "[email protected]")
    UserMailer.with(user: user).confirmation
  end
end

그러나 때때로 메일러는 개체 자체가 아니라 데이터베이스에 있는 레코드의 ID를 기대합니다. 예를 들어 새 이메일 확인 토큰을 생성하기 위해 이 레코드를 준비해야 하는 경우도 있습니다.

# test/mailers/previews/user_mailer_preview.rb

class UserMailerPreview < ActionMailer::Preview
  def confirmation
    user = User.first
    user.prepare_token!(:confirmation)
    UserMailer.with(user_id: user.id).confirmation
  end
end

그러나 이것은 일시적인 변화일 뿐입니다. 물론 전체 메소드를 데이터베이스 트랜잭션으로 래핑하고 데이터베이스 롤백 명령을 사용할 수 있습니다. 하지만… 정확히 어떻게?

다행히 일부 Rails 원숭이 패치를 사용하여 이를 수행하는 쉬운 방법이 있습니다. 다음 모듈을 생성하면 됩니다.

# lib/core_extensions/mailer_preview_rollback

module CoreExtensions
  module MailerPreviewRollback
    def preview
      ActiveRecord::Base.transaction do
        super
        raise ActiveRecord::Rollback
      end
    end
  end
end

Ruby on Rails 애플리케이션에서 이니셜라이저를 만들고 이 모듈을 추가합니다.

# config/initializers/mailer_preview_rollback.rb

Rails.configuration.after_initialize do
  require "core_extensions/mailer_preview_rollback"
  Rails::MailersController.prepend CoreExtensions::MailerPreviewRollback
end

그리고 짜잔! 이제 모든 메일러 미리보기가 데이터베이스 트랜잭션에 안전하게 래핑됩니다.


원문: How to wrap Rails mailer previews in a database transaction

좋은 웹페이지 즐겨찾기