Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 按照正确的工厂模式从控制器调用服务方法_Ruby On Rails_Ruby_Oop_Factory Pattern - Fatal编程技术网

Ruby on rails 按照正确的工厂模式从控制器调用服务方法

Ruby on rails 按照正确的工厂模式从控制器调用服务方法,ruby-on-rails,ruby,oop,factory-pattern,Ruby On Rails,Ruby,Oop,Factory Pattern,我有以下课程 class EvaluateService def initialize end def get_url end def self.evaluate_service @instance ||= new end end class CheckController < ApplicationController def index get_url = EvaluateService.get_url end end 类评估服务

我有以下课程

class EvaluateService
  def initialize
  end

  def get_url
  end

  def self.evaluate_service
    @instance ||= new
  end
end

class CheckController < ApplicationController
  def index
    get_url = EvaluateService.get_url
  end
end
类评估服务
def初始化
结束
def获取url
结束
def自我评估服务
@实例| |=新建
结束
结束
类CheckController
这里的问题是,我知道我可以做
evaluate\u service=EvaluateService.new
并使用对象
evaluate\u service.get\u url
,它会很好地工作,但我也知道有些人不赞成用这种方式初始化服务对象,而是有一种通过调用初始化它的方法,服务类中的send方法


只是想知道我该怎么做?

有多种方法可以实现这一点

如果
EvaluateService
中的方法不需要状态,您可以只使用类方法,例如:

class EvaluateService
  def self.get_url
    # ...
  end
end

class CheckController < ApplicationController
  def index
    @url = EvaluateService.get_url
  end
end
但全局对象可能很棘手


或者,您可以在控制器中使用帮助器方法来创建服务实例(根据需要)并将其记忆:

class EvaluateService  
  def get_url
    # ...
  end
end

class CheckController < ApplicationController
  def index
    @url = evaluate_service.get_url
  end

  private

  def evaluate_service
    @evaluate_service ||= EvaluateService.new
  end
end
类评估服务
def获取url
# ...
结束
结束
类CheckController

甚至可以将其移动到您的
应用程序控制器上

有多种方法可以实现这一点

如果
EvaluateService
中的方法不需要状态,您可以只使用类方法,例如:

class EvaluateService
  def self.get_url
    # ...
  end
end

class CheckController < ApplicationController
  def index
    @url = EvaluateService.get_url
  end
end
但全局对象可能很棘手


或者,您可以在控制器中使用帮助器方法来创建服务实例(根据需要)并将其记忆:

class EvaluateService  
  def get_url
    # ...
  end
end

class CheckController < ApplicationController
  def index
    @url = evaluate_service.get_url
  end

  private

  def evaluate_service
    @evaluate_service ||= EvaluateService.new
  end
end
类评估服务
def获取url
# ...
结束
结束
类CheckController

甚至可以将其移动到您的
应用程序控制器

我认为您需要的是:

class Evaluate
  def initialize(foo)
    @foo = foo
  end

  def self.call(foo)
    new(foo).call
  end

  def call
    url
  end

  private

  def url
    # Implement me
  end
end
现在,您可以在控制器中执行此操作:

class CheckController < ApplicationController
  def index
    @url = Evaluate.call(params)
  end
end
class CheckController

一些人喜欢将
#call
作为入口点的原因是它与lambdas是多态的。也就是说,在任何可以使用lambda的地方,都可以将其替换为
Evaluate
,反之亦然。

我认为您需要的是:

class Evaluate
  def initialize(foo)
    @foo = foo
  end

  def self.call(foo)
    new(foo).call
  end

  def call
    url
  end

  private

  def url
    # Implement me
  end
end
现在,您可以在控制器中执行此操作:

class CheckController < ApplicationController
  def index
    @url = Evaluate.call(params)
  end
end
class CheckController

一些人喜欢将
#call
作为入口点的原因是它与lambdas是多态的。也就是说,在任何可以使用lambda的地方,都可以将其替换为
Evaluate
的实例,反之亦然。

基本上,我就是这样做的。但是,你能不能扩展一下你的评论,说它是“lambdas的多态性”?我添加了一个简短的补充,但是如果你不知道多态性是什么,你应该去了解它。这是Ruby最基本的概念之一。谢谢!我想,也许,我已经做了很长一段时间的“lambas多态性”了,而不知道它有一个实际的名字。每天学习新的东西。再次感谢您周到的回复。基本上,我就是这样做的。但是,你能不能扩展一下你的评论,说它是“lambdas的多态性”?我添加了一个简短的补充,但是如果你不知道多态性是什么,你应该去了解它。这是Ruby最基本的概念之一。谢谢!我想,也许,我已经做了很长一段时间的“lambas多态性”了,而不知道它有一个实际的名字。每天学习新的东西。再次感谢您周到的回复。