【问题标题】:Rails Action Mailer and returning Status 200 if the email was sentRails Action Mailer 并在发送电子邮件时返回 Status 200
【发布时间】:2021-01-22 10:45:52
【问题描述】:

我有一个带有以下 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 或错误消息或其他任何适当的信息。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-5 actionmailer


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      目前尚不清楚您的控制器是从客户端应用程序调用(您将其作为 JSON api 处理)还是普通的 rails 表单。

      如果是json api/service,可以尝试将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
      
      

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 2012-07-25
        • 2015-09-08
        • 2011-07-14
        • 2011-05-15
        • 2019-10-29
        相关资源
        最近更新 更多