我尝试坚持瘦控制器和瘦模型的原则。我相信与业务逻辑相关的代码应该在服务类中。
我编写了一个接受JSON请求的Rails后端应用程序。我需要验证,一个参数是否存在。我们假设我有:
class UserController
def change_status
user = User.find(params[:id])
render json: UserStatusChanger.new(user, params[:status]).perform!
end
end
class UserStatusChanger
attr_reader :user, :status
def initialize(user, status)
@user = user
@status = status
end
def perform!
# complex logic here
{result: 'ok'}
end
end
现在让我们假设我需要接收非空白参数[:status] 。当然,在现实世界中,参数越多越复杂。 :)
我的问题是:我应该在哪里验证params [:status]?
我的想法是:
如果我把它放在控制器中,我需要一个集成测试来测试验证。但是有一些很好看的解决方案,如rails_params gem。但我可以面对大控制器方法的问题,有很多验证。而且在单元测试中,如果某些输入参数为nil
而未经验证,则在执行复杂逻辑之前,我的服务将会出错。
如果我放入服务,测试将更轻量级。但是我应该通过ApplicationController#rescue_from
捕获异常,这将不会被测试。
答案 0 :(得分:1)
我想,你应该在控制器中做到这一点。至于我,我通常用before_action
方法来做。根据MVC模式,所有参数和路由逻辑必须在控制器中。