4

我正在编写一个只有 REST API(没有 Web 界面等)的 Rails 应用程序。我需要检查是否使用正确的参数发出请求,如果不是,则返回不同的错误代码。例如,我所有的 API 端点都需要一个 user_access_token 和一个 client_id。其他一些端点需要存在其他不同的参数。

在所有控制器中,我都有执行此检查的代码,但是代码被重复了,并且有许多 if 条件可以提取出来并放在其他地方。所以我想before_filter在我的ApplicationController那个中添加一个来做这个检查。我定义了一个包含所有端点到 required_pa​​rams 映射的哈希,并且这个过滤器在控制传递给实际的控制器之前运行。

但是对于某些端点,它变得有点复杂,因为如果存在其他一些参数,则需要一些参数,并且在某些情况下需要两个参数之一。所以现在我想知道是否有更好的方法来做到这一点。

我做对了吗?有没有更好/标准化的方法来做到这一点?或者一些这样做的宝石?

4

1 回答 1

5

我必须查看一些代码才能理解上下文。但它本质上听起来就像你有你的所有其他控制器继承的基础 ApplicationController。不同的是您期望的参数(除了总是需要提供的 user_access_token 和 client_id )。由于您使用的是继承,您可以在 ApplicationController 中定义一个方法,其中包含您期望的参数列表,然后在您的子类中覆盖该方法以检查添加其他参数。您的基本控制器将负责进行实际验证,但子类将有机会覆盖所需的参数。

class ApplicationController < ActionController::Base
  before_filter :validate_params

  protected

  def required_params
    [:user_access_token, :client_id]
  end

  def validate_params
    unless (require_params - params.keys).count.zero?
      # do something
    end
  end
end

class AnotherController < ApplicationController
  protected

  def required_params
    p = super + [:email, :password]
    p = p + [:another, :and_another] if some_condition?
    p
  end
end

本质上,您会让子类决定是否需要添加任何额外的必需参数。当然,我不知道您的确切上下文是什么,但希望这会帮助您朝着正确的方向前进。有机会时对多态性进行一些研究:-)

于 2013-08-29T22:15:01.747 回答