Rails服务对象和控制器

时间:2016-04-14 22:18:02

标签: ruby-on-rails architecture controller anti-patterns service-object

我有一位同事喜欢将控制器传递给服务对象。例如,控制器方法可能看起来如下:

class FooController < ApplicationController

  ...

  def show
    Foo.new(self).call
  end

  ...

end

服务对象如下所示:

class Foo

  attr_reader :controller, :resource_id

  delegate :render, :params, :head, to: :controller

  def initialize(controller, resource_id)
    @controller = controller
    @resource_id = resource_id
  end

  def call
    resource = SomeActiveRecordModel.find(resource_id)
    if resource
      render json: resource.to_json
    else
      head :not_found
    end
  end

end

不知何故,我觉得这会适得其反,也是货物崇拜软件工程的一个例子。

我更希望将服务对象与控制器完全分开。依赖关系将被传递到服务对象的构造函数中,参数将作为方法参数传递到服务对象中。只需从方法中返回任何结果。

可悲的是,每当我在代码审查中提出这个问题时,我的同事们都不会对此感到非常激动,我反过来觉得这相当令人沮丧。

各自方法的优点是什么?我怎样才能更好地论证我的情况?我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:1)

我怀疑答案是&#34;它取决于&#34;。

在您给出的确切示例中,我认为没有特别的优势,它会产生一定程度的混淆。另外,一般来说,我同意你将服务对象与控制器分开。

但是,有时候我发现自己将控制器传递给服务对象。例如,当我在动态构建视图时有很多复杂的工作要做。