API Controller 专用于共享方法

API Controller Specifically for shared methods

在我的 RoR 应用程序中为不同模型之间的共享方法创建某种 'general api controller' 是否是最佳实践?例如,我包括 Customers 的电子邮件验证 - 一旦用户完成输入电子邮件地址(提交前),$.ajax POST 请求将发送到 customers_controller调用外部 API 的地方。解析响应后,我 return 根据特定条件返回响应。验证在提交前在前端实时处理,以便用户在提交前可以知道电子邮件地址是否有效。控制器方法如下。

  def validate_email_address
    response = ValidateEmailAddressJob.perform_now(params[:email], "Agentapp")
    data = JSON.parse response.body

    if data['result']['verdict'] == "Valid" || data['result']['verdict'] == "Risky"
      html = "<div class='text-success'><i class='fa fa-check'></i> This email appears to be valid</div>"
      render json: {html: html, result: data['result']}, status: 200
    elsif data['result']['verdict'] == "Invalid"
      html = "<div class='text-warning'><i class='fa fa-exclamation'></i> This email may be invalid</div>"
      render json: {html: html, result: data['result']}, status: 200
    else
      render json: {}, status: 503
    end
  end

我试图让我的代码尽可能干,所以如果我想与 VendorContacts 共享这个 email_validation 控制器方法,我想我可以指出other VendorContact API 调用 /customers/validate_email_address 端点,即使它在技术上不是需要验证的 customer?或者我可以将控制器方法复制并粘贴到 vendor_contacts_controller?或者我可以创建一个单独的通用 api 控制器,其端点例如 /validation/emailaddress.

提前感谢您的帮助,我只是想了解处理这种情况的适当方法。

我不知道这是否会被视为“最佳实践”,但作为一个长期的 Rails 开发者,我的方法是创建一个 EmailController 控制器,只需一个动作create,和一个 Email 模型(不继承自 ActiveRecord::Base)。

class EmailController < ApplicationController
  def create
    email = Email.new(params[:email])
    if email.valid?
      render partial: :valid_email_response
    else
      render partial: :invalid_email_response
    end
  end
end

因此电子邮件模型有一个 initialize 方法和一个 valid? 方法,并且 html 响应包含在单独的视图文件中。当然,这里什么也没有保存到数据库中。每当您希望验证电子邮件地址时,都会调用 EmailController#create 操作。

我的理由是控制器应该实现 CRUD 方法,在这种情况下,模型应该处理验证。我相信这完全符合“Rails 方式”。

恕我直言 Rails 控制器可以成为各种应用程序逻辑的包罗万象 类,并且将逻辑强制转换为 MVC 格式可以生成最干净的代码。