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 格式可以生成最干净的代码。
在我的 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 格式可以生成最干净的代码。