【问题标题】:rails namespacing service objectsrails命名空间服务对象
【发布时间】:2013-10-01 05:52:21
【问题描述】:

我刚刚在控制器和模型之间写了一个服务对象来“标记出勤”,所以现在我有一个用于控制器操作的对象,如下所示:

class BookingAttendancesController
  def mark_attending
    attendance_marker = BookingAttendances::AttendanceMarkerService.new params, current_entity
    result = attendance_marker.call
    # flash msg etc
  end
end

以及服务对象(当前实现):

# app/services/booking_attendances/attendance_marker_service.rb
module BookingAttendances
  class AttendanceMarkerService
    def initialize(params, entity)
      # ...
    end
    def call
      # ...
    end
    # ...
  end
end

理想情况下,我想在控制器类中命名服务对象,但 rails 期望该文件定义服务类,而不是嵌套在控制器中的服务类。

模块的名称​​可用,但我不确定这是否有约定。总的来说,我想最困扰我的是我真的想在控制器中定义那个类,但是在一个单独的文件中(可能有嵌套)。我可以将模块包含在控制器中,但这并不是我的重点。在 Rails 中命名空间服务对象是否有最佳实践?

【问题讨论】:

    标签: ruby-on-rails namespaces service-object


    【解决方案1】:

    您的业务逻辑在控制器中执行,但如果您将其提取到服务中,抽象应该是真实的。

    我的意思是你只在服务中使用你的模型。这样:

    • 你有一个独立于控制器的服务

    • 你有一个可重用的服务

    因此,可重用服务没有理由在控制器名称之后命名空间,在模型名称之后命名空间更有意义。所以你做的很好。

    顺便说一句,即使文件夹中有点无聊和丑陋,我确实将我的服务放在 app/services/services 中,这样我就可以在 Services 模块中命名所有服务。

    【讨论】:

    • 绝对同意坚持模型,谢谢。但我不明白我是否通过将模型复数得到了正确的约定,或者没有约定
    • 这里没有规定,随心所欲
    • Services 模块中使用命名空间服务绝对是个好主意(否则,当您的应用程序中已经有Person 模型时,在尝试使用Person 命名空间时最终会遇到问题)。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2010-09-07
    • 2011-09-19
    • 1970-01-01
    • 2011-05-09
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多