0

我正在使用Restforce从远程 salesforce 实例中查询记录。用户只需为他们想要查询的记录输入一个有效的 UID。

Restforce 使用Faraday 中间件来处理 http 请求 -Faraday::ResourceNotFound如果我请求无法在远程 salesforce 数据库中找到的内容,则会引发错误。

问题

我应该在哪里验证用户输入?

我有两个想法,但我不确定每个想法的后果......我正在努力研究如何最好地坚持胖模型 - 瘦控制器最佳实践。

检查应用程序控制器级别的成功查询

请求将 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 请求。

对两者都有什么影响,我怎样才能做得更好?

4

1 回答 1

0

我认为使用模型级别验证的最佳方法如下:

validate :something

def something
  errors.add(:field, 'error message') unless RestClient.check_something
end

其中 RestClient 是 /lib 文件夹中的单例对象。这将允许保持控制器清洁。

于 2016-01-23T21:20:33.453 回答