Rails DRY RESTful设计的API端点带有过滤器

时间:2016-11-15 09:43:58

标签: ruby-on-rails api ruby-on-rails-4

我正在使用Rails 4.2开发JSON API,如下所示:

GET api/v1/car  => app/controller/api/v1/car_controller#index
GET api/v1/car/:id/installment  => app/controller/api/v1/carresources/installment_controller#index

现在我想用过滤器扩展这些端点。

api/v1/carresources/installment#index

  • 特定时段内特定车辆的所有分期付款
  • 按付款类型(现金,手机钱,< - 移动货币提供商)的特定汽车的所有分期付款

api/v1/car#index

  • 按地区划分的所有汽车
  • 所有经销商的汽车
  • 贷款架构的所有汽车

我实施的方式如下:

app/controller/api/v1/car_controller.rb

def index  
   res = []
   if params.key?('start_date') and parms.key?('end_date')
     res = Car.index_period(params['start_date'], params['stop_date']
   elsif params.key?('loanstructure')
     res = Car.index_loan_strucuture(params['loan_strucuture'])
    ....
   end
end

哪个有效,但没有一个很好的解决方案,在这些if - “graves”背后放置完全语义不同的逻辑。 可以为每个过滤器创建一个新的端点,但我觉得这会使路由和控制器结构膨胀。

我还想避免使用这些if子句,因为这些也是对用户角色的一些授权 - 我跳过显示 - 这也是用if clauses完成的 还有另一种聪明的方法,或者我应该为每个过滤器花费额外的路径,然后我需要复制整个授权结构。 提前谢谢了 非常感谢提前

1 个答案:

答案 0 :(得分:0)

OP我建议通过在过滤器类中处理request.query.params来单独破坏过滤代码。

此过滤器类有助于通过

解耦代码
  1. 允许验证正在传递的过滤器,这样您就可以拥有in LibGit2Sharp.Core.NativeMethods.git_reference_lookup(git_reference*& reference, git_repository* repo, String name) in LibGit2Sharp.Core.Proxy.git_reference_lookup(RepositoryHandle repo, String name, Boolean shouldThrowIfNotFound) in c:\projects\libgit2sharp\LibGit2Sharp\Core\Proxy.cs:riga 1932 in LibGit2Sharp.ReferenceCollection.Resolve[T](String name) in c:\projects\libgit2sharp\LibGit2Sharp\ReferenceCollection.cs:riga 441 in LibGit2Sharp.Repository.get_Head() in c:\projects\libgit2sharp\LibGit2Sharp\Repository.cs:riga 268 in GitManager.get_CurrentBranch() in C:\Repository\MyProject\GitRepositoryManagement\GitManager.cs:riga 80 功能。

  2. 您可以使用指向

  3. 的哈希表

    parseFilters

    这将帮助您直接从parsefilters应用过滤器。 这将确保您的代码解耦,也可以在其他方案中重用。