0

そのため、RailsアプリにPresentersを使用するための最初の一歩を踏み出し、コードの一部のリファクタリングを検討しています。電話番号(電話、携帯電話、ファックスなど)を適切にフォーマットしたり、「指定なし」と表示したりするフィールドがいくつかあります。明らかに、私はもともとこれをビューに持っていましたが、ロジックをプレゼンターに移動しました。そこで私はそれがすべて同じであることに気づいたので、メソッド名とsend関数を使用するプライベートメソッドにリファクタリングしました:

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はメソッド名を使用しているため、3つの別々のメソッドを定義する必要があるようです。ここでもっと何かできることがあるかどうか興味がありました。

ps hande_noneは、そこに何かがある場合は単にブロックを返すか、「nonegiven」を返します

4

1 に答える 1

0

私は通常、実際のゲッター/メソッド/属性の名前を、それらのフォーマットに使用されるメソッドと混合することを避けています。

そのため、私は*_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 に答える