验证&外部API - 控制器或Fatten模型验证中的救援?

时间:2015-05-09 11:48:52

标签: validation ruby-on-rails-4 faraday

我正在使用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请求。

对这两者有什么影响,我可以做得更好?

1 个答案:

答案 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文件夹中的单例对象。这样可以保持控制器清洁。