我正在使用Restforce来查询远程salesforce实例中的记录。用户只需为他们想要查询的记录输入有效的UID。
Restforce使用Faraday middleware来处理http请求 - 如果我请求远程salesforce数据库中找不到的内容,则会引发Faraday::ResourceNotFound
错误。
问题
我应该在哪里验证用户输入?
我有两个想法,但我不确定每个人的后果......我试图找出如何最好地适应胖模型 - 瘦的控制器最佳实践。
检查应用程序控制器级别的查询是否成功
请求将UID保存到简单的ActiveRecord模型@record_request
。我的create方法可以触发查询,检查错误并在需要时闪存/重定向用户。
# app/controllers/record_requests_controller
def create
@record_request = current_user.record_requests.new(record_request_params)
# Check to see if CHAIN number exists
if @record_request.restforce.find("Contact", @record_request.chain_number, 'ClientID__c')
# If it gets past that do standard validation checks
if @record_request.save
flash[:success] = 'Record request was successfully created.'
redirect_to record_requests_path
else
render :new
end
end
end
然后在ApplicationController中我有一个救援方法设置
# app/controllers/application_controller
rescue_from Faraday::ResourceNotFound, with: :resource_not_found
private
def resource_not_found
flash[:alert] = 'Cannot find resource on Salesforce'
redirect_to(:back)
end
这个有效!看起来很好......但是......
模型级验证?
我的直觉告诉我这是一个验证,应该在模型级别进行验证,如果有错误和某些内容潜入我的数据库会怎么样?这一切都应该在if @record_request.save
时刻检查吗?
如果是这样的话...我将如何获得模型级代码来处理验证并能够在不破坏MVC的情况下发起外部(OAuth认证的)API请求。
对这两者有什么影响,我可以做得更好?
答案 0 :(得分:0)
我认为使用模型级验证的最佳方法是:
Thread t = new Thread() {
public void run () {
SleeperMillis.sleepInMillis(new Duration(10000000l));
}
}.start();
Thread.sleep(100); // let the other thread start
t.interrupt;
其中RestClient是/ lib文件夹中的单例对象。这样可以保持控制器清洁。