【问题标题】:API Controller Specifically for shared methodsAPI 控制器专用于共享方法
【发布时间】:2021-09-25 14:08:44
【问题描述】:

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

  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 控制器方法,我想我可以将另一个 VendorContact API 调用指向 @ 987654327@ 端点,即使它在技术上不是需要验证的customer?或者我可以将控制器方法复制并粘贴到vendor_contacts_controller 中?或者我可以创建一个单独的通用 api 控制器,其端点为 /validation/emailaddress

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

【问题讨论】:

  • 为什么不创建通用验证端点? /validation/email_address ?
  • @Archer 感谢您的想法!但是我会将实际的validate_email_address 方法留在customers_controller 中吗?
  • 如果你还想同时使用两个控制器,你可以把方法放在控制器的超类中,例如class Api::CustomersControllers &lt; Api::ApiController 然后你只需要api_controller中的方法,两个控制器都可以访问都继承自 api_controller。
  • if data['result']['verdict'] == "Valid" || data['result']['verdict'] == "Risky" 很臭,因为 API 的逻辑正在泄漏到控制器中。控制器应该只是询问result.valid?.

标签: ruby-on-rails api model-view-controller


【解决方案1】:

我不知道这是否会被认为是“最佳实践”,但作为一名长期的 Rails 开发人员,我的方法是创建一个 EmailController 控制器,具有单个操作 create 和一个 @987654323 @model(不是从 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 Way”。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2021-12-25
    • 2019-01-04
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多