哪里验证输入参数?在控制器或服务类中,由控制器使用?

时间:2016-02-11 13:17:33

标签: ruby-on-rails ruby

我尝试坚持瘦控制器和瘦模型的原则。我相信与业务逻辑相关的代码应该在服务类中。

我编写了一个接受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]?

我的想法是:

  1. 如果我把它放在控制器中,我需要一个集成测试来测试验证。但是有一些很好看的解决方案,如rails_params gem。但我可以面对大控制器方法的问题,有很多验证。而且在单元测试中,如果某些输入参数为nil而未经验证,则在执行复杂逻辑之前,我的服务将会出错。

  2. 如果我放入服务,测试将更轻量级。但是我应该通过ApplicationController#rescue_from捕获异常,这将不会被测试。

1 个答案:

答案 0 :(得分:1)

我想,你应该在控制器中做到这一点。至于我,我通常用before_action方法来做。根据MVC模式,所有参数和路由逻辑必须在控制器中。