依赖于__method__的重构方法

时间:2012-07-27 21:03:59

标签: ruby-on-rails ruby methods refactoring

所以我迈出了第一步,在我的rails应用程序中使用Presenters,我只是在看一些代码的重构。我有几个字段显示电话号码(即电话,手机和传真)格式良好或显示“无给定”。显然我最初在视图中有这个,但将逻辑移到我的演示者。在那里,我注意到它是完全相同的,所以重构为一个使用方法名称和发送函数的私有方法:

class CustomerPresenter < BasePresenter
  presents :customer

  def phone
    format_number(__method__)
  end

  def cell
    format_number(__method__)
  end

  def fax
    format_number(__method__)
  end

private

  def format_number(method)
    hande_none customer.send(method) do
      h.number_to_phone(customer.send(method), :area_code => true)
    end
  end
end

然而这段代码似乎仍然不干净。因为format_number使用方法名称,所以我似乎必须定义三个单独的方法。如果我能在这里做更多的事情,我很好奇。

P.S。 hande_none只是返回块,如果有东西或返回“none given”

1 个答案:

答案 0 :(得分:0)

我通常避免将实际的getter / method / attributes名称与用于格式化它们的方法混合起来。

这就是我使用*_formatted后缀的原因:使用一般后缀,你可以使用一个简单的method_missing来引导你:

class CustomerPresenter < BasePresenter
  presents :customer

  private

  def format_number(method)
    hande_none customer.send(method) do
      h.number_to_phone(customer.send(method), :area_code => true)
    end
  end

  def method_missing(method_name, *args, &block)
    case method_name
    when /(.*)_formatted$/
      #here you could create the method on the fly to avoid method missing next time
      return format_number( $1 )
    end    
    super(method_name, *args, &block)
  end
end

基本上,我在我的BasePresenter中使用*_currency_format