【问题标题】:Rails - Controller DRY - Generic way of doing common filtering/sorting/paginationRails - 控制器 DRY - 进行常见过滤/排序/分页的通用方法
【发布时间】:2021-03-02 20:55:47
【问题描述】:

开发一个新的 API,我注意到我将在多个索引中重复相同的代码,试图避免这种情况,但不确定最好的方法?

当前情景:

books_controller

    def index
      books = Book.filtered(query_params).sorted(sorting_params)
      .page(pagination_params[:page])
      .per(pagination_params[:per_page])
      #.includes(:author) // placeholder for dynamic includable associations

      json_response(BooksSerializer.new(books).as_json)
    end

我最初的想法是创建ResourcesService,它将接收一个模型,例如Book 类,然后从那里应用方法(过滤、排序..分页)并返回一个ActiveRecord_Relation 对象以进行序列化和返回。

不确定如何编写它(作为 PORO 或模块)

关于如何使这个 DRY 并可跨控制器重复使用的任何提示?

实现类似,在其他控制器上重现:

books = ResourceService.new(Book, query_params, sorting_params, pagination_params, includables)

【问题讨论】:

    标签: ruby-on-rails ruby design-patterns dry


    【解决方案1】:

    您在app/controllers 中有一个concerns 文件夹,您可以使用它来存储您在许多不同控制器中需要的模块。

    您所描述的通常是 concerns 的用途。

    只需在app/controllers/concerns 中创建一个模块并在其中定义您的方法。然后include控制器中的模块(不需要),随意使用。

    【讨论】:

      猜你喜欢
      • 2015-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多