Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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 - Fatal编程技术网

Ruby on rails 使用某种机制来修剪方法的返回值

Ruby on rails 使用某种机制来修剪方法的返回值,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有服务api。在我的Base类中有一些方法,我有继承这个类并实现其方法的具体实现。我几乎没有Base类的实现者 我有大约20个方法,我想修剪所有这些方法的返回值。但我不太确定是否要添加一段代码来修剪20个方法中每个方法的返回值。我一直在寻找更好的方法 我想我是在这里找到的: 但是这种方法只适用于我的Base类,而不适用于实现Base类的类。如何将其应用于我所有的实现者类?我认为实现Presenter(也称为Exhibit)模式是有意义的。基本概念是使用代理来包装对象,代理添加了一层表示逻辑。

我有服务api。在我的
Base
类中有一些方法,我有继承这个类并实现其方法的具体实现。我几乎没有
Base
类的实现者

我有大约20个方法,我想修剪所有这些方法的返回值。但我不太确定是否要添加一段代码来修剪20个方法中每个方法的返回值。我一直在寻找更好的方法

我想我是在这里找到的:


但是这种方法只适用于我的
Base
类,而不适用于实现
Base
类的类。如何将其应用于我所有的实现者类?

我认为实现Presenter(也称为Exhibit)模式是有意义的。基本概念是使用代理来包装对象,代理添加了一层表示逻辑。您可以在此处找到有关此模式的更多信息:

了解一些真实的代码,您可以想象有这样一个类:

class Test
  def baked
    "  baked"
  end

  def beans
    "  beans  "
  end

  def food_methods
    [:baked, :beans]
  end
end

test = Test.new
p "#{test.baked} #{test.beans}"
Ruby标准库提供了一个名为SimpleDelegator的简洁实用程序,它提供了我们需要的大部分功能。因此,我们只需要简单地定义一些方法,并将原始对象包装到新的呈现对象中:

需要“委托”
类TestPresenter
警告:此解决方案不如@ju liu的“干净”,可能也不是最有效的,但它较短,更容易在您的工作流中实现。您可能还希望限制要重新定义的方法,并构建更好的错误处理

基础
类中,您可以执行以下操作:

(Base.instance_methods - Class.instance_methods).each do |method|  
  alias_method "#{method}_backup", method    
  class_eval %Q{    
    def #{method}(*args)
      #{method}_backup(*args).strip rescue #{method}_backup(*args)
    end
  }
end

您不能创建一个具有trim包装器方法的中间类吗?那么
模块如何
您可以
包含该功能上的层?
(Base.instance_methods - Class.instance_methods).each do |method|  
  alias_method "#{method}_backup", method    
  class_eval %Q{    
    def #{method}(*args)
      #{method}_backup(*args).strip rescue #{method}_backup(*args)
    end
  }
end