【问题标题】:Validation & External APIs - Rescue in Controller or Fatten Model validations?验证和外部 API - 控制器或胖模型验证中的救援?
【发布时间】:2015-05-09 11:48:51
【问题描述】:

我正在使用Restforce 从远程销售人员实例中查询记录。用户只需为他们想要查询的记录输入一个有效的 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 请求。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      相关资源
      最近更新 更多