我正在编写一个仅具有REST API的Rails应用程序(没有Web界面等)。我需要检查是否使用正确的参数进行请求,如果没有则返回不同的错误代码。例如,我的所有API端点都需要user_access_token和client_id。其他一些端点需要存在其他不同的参数。
在所有控制器中,我都有执行此检查的代码,但代码重复,并且有许多if条件可以提取出来并放在其他地方。所以我想在before_filter
中添加ApplicationController
进行此检查。我定义了一个包含所有端点到required_params映射的哈希,并且该过滤器在控件传递给相关实际控制器之前运行。
但是对于某些端点来说,它有点复杂,因为如果存在其他一些参数则需要一些参数,并且在某些情况下需要两个参数中的一个。所以现在我想知道是否有更好的方法。
我做得对吗?这样做有更好/标准化的方法吗?或者是一些这样做的宝石?
答案 0 :(得分: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
基本上你会让子类决定是否需要添加任何额外的必需参数。当然我不知道你的确切背景是什么,但希望这会帮助你朝着正确的方向前进。当你有机会做一些关于多态的研究: - )