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

问题描述

我有一个带有以下Mailer的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 Forms在这里不起作用。

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

仅在邮件程序成功的情况下,使控制器返回200 OK响应的正确方法是什么?否则,返回404或错误消息或其他适当的信息。

解决方法

尚不清楚是从客户端应用程序(您将其作为JSON API处理)中调用您的控制器,还是它是纯导轨形式。

如果使用json api /服务,则可以尝试将json渲染回

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控制器/应用程序,则建议将用户重定向到某个地方:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...