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

标签 ruby-on-rails ruby

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

我有大约 20 个方法,我想减少所有这些方法的返回值。但是我犹豫要不要添加一些代码来修剪 20 种方法中每一种方法的返回值。我一直在寻找一种更好的方法来做到这一点。

我虽然在这里找到了它:

http://cheind.blogspot.com/2008/12/method-hooks-in-ruby.html

但这种方法只适用于我的 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 的简洁实用程序,它提供了我们需要的大部分功能。因此我们只需要动态定义一些方法并将原始对象包装在一个新的呈现对象中:

require 'delegate'

class TestPresenter < SimpleDelegator
  Test.new.food_methods.each do |method|
    define_method(method) do |*args|
      __getobj__.send(method, *args).strip
    end
  end
end

presenter = TestPresenter.new(test)
p "#{presenter.baked} #{presenter.beans}"

关于ruby-on-rails - 使用某种机制来修剪方法的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17277362/

相关文章:

ruby - 公制傅 : RCov fails to load spec_helper

ruby-on-rails - FactoryBot 可以在创建模型后生成工厂吗?

ruby - 如何使用 Puma 或 Unicorn 启动一个最小的 ruby​​ 应用程序?

ruby-on-rails - 使用 tmux 时如何保留我的 rvm gemset?

ruby-on-rails - 使用 Rails 在同一页面上显示多个表单

ruby-on-rails - 记录更改等待特权用户的批准;它就像版本控制与批准相结合

ruby-on-rails - 使用 RSpec 创建 gem 的好教程是什么?

ruby-on-rails - 在 routes.rb 上为 Ruby on Rails 的根设置可选参数

ruby-on-rails - 加速 rspec Controller 测试 : using before all fails?

ruby-on-rails - Rails 中的高级样式表