Rails Action Mailer 并在电子邮件已发送时返回状态 200

Rails Action Mailer and returning Status 200 if the email was sent

我有一个 Rails API,邮件程序如下:

  def demo_request
    @user = params[:user]

    mail(
        to: "foo@bar.com",
        subject: "[DEMO REQUEST] #{@user[:name]} - #{@user[:email]}",
        body: "A potential customer, #{@user[:name]}, requested a demo be sent to them. You can follow up with them at #{@user[:email]}",
        content_type: "text/html"
    )
  end

很简单的一个,由以下控制器触发:

  class DemoRequestsController < ApplicationController
    skip_before_action :authenticate_user!

    def create
      @user = params.permit(:email, :name)
      UserMailer.with(user: @user).demo_request.deliver_now
    end
  end

也非常简单,它只是在收到带有一些参数的 POST 请求时调用 Mailer。此 API 正被客户端应用程序使用,Rails 表单在这里不起作用。

在测试中,我可以看到 Mailer 似乎工作正常,但问题是,控制器显然会 return 一个 204: No Content 响应。

仅当 Mailer 成功时,让控制器 return 响应 200 OK 的正确方法是什么?否则,return 404 或错误消息或其他任何合适的信息。

不清楚您的控制器是从客户端应用程序调用的(您将其作为 JSON api 处理)还是纯 rails 形式。

如果 json api/service,你可以尝试渲染 json back

begin
  UsererMailer.with(user: @user).demo_request.deliver_now
  render json: { message: 'ok' }, status: 200
rescue StandardError => e
  render json: { error: e.inspect }, status: 500
end

如果是常规 Rails controller/app,那么我建议将用户重定向到某个地方:

begin
  UsererMailer.with(user: @user).demo_request.deliver_now
  redirect_to some_path
rescue StandardError => e
  redirect_to some_path, error: e.inspect
end

一个简单的head :ok可能就足够了。

def create
  @user = params.permit(:email, :name)
  UserMailer.with(user: @user).demo_request.deliver_now
  head :ok
end

因为如果发送电子邮件失败,那么无论如何都会有 500 ServerError