rails命名空间服务对象

时间:2013-10-01 05:52:21

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

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

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中是否存在命名空间服务对象的最佳实践?

1 个答案:

答案 0 :(得分:5)

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

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

  • 您拥有与控制器无关的服务

  • 您有可重复使用的服务

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

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