0

因此,我迈出了将 Presenters 用于我的 Rails 应用程序的第一步,我只是在重构我的一些代码。我有几个字段可以很好地显示电话号码(即电话、手机和传真)或显示“未给出”。显然,我最初在视图中有这个,但将逻辑移到了我的演示者中。到了那里,我注意到它都是一样的,所以将它重构为一个使用方法名称和发送函数的私有方法:

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 使用方法名称,所以我似乎必须定义三个单独的方法。我很好奇这里是否还有更多我可以做的事情。

ps hande_none 如果那里有东西,则简单地返回块或返回“没有给定”

4

1 回答 1

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

于 2012-07-27T21:12:35.767 回答