【发布时间】: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 < 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