0

私は優れた勤務時間表アプリケーションを持っています。すべてが正常に動作するようになりました。リファクタリングの時間です。特に一部のビューは非常に複雑です。そのため、たとえばデコレータを使用してそれらをクリーンアップしたいと考えています。

もう 1 つのことは、かなりの量のサービス オブジェクトを使用していることです。それらは素晴らしく、モデルをきれいに保ちますが、ビューでそれらを使用することは望ましくありません。ここでリファクタリングのアドバイスを探しています。ビュー コードの次のフラグメントを考えてみましょう。

  .row
    .span12#timesheet
      - days = @timesheet_builder.get_days_in_month

      %table.table.days
        %tbody
          - (1..days).each do |day_nr|
            - activity_date = Date.new(@timesheet.year, @timesheet.month, day_nr)

            - if @timesheet_builder.is_workday?(day_nr)
              - day_type = "workday"
            - else
              - day_type = "non_workday"

            %tr.day(class=day_type)
              %td.date{ "data-title" => "#{I18n.t('.timesheet.day_nr')}" }
                .day_abbr= @timesheet_builder.get_day_name(day_nr)
                .day_nr= day_nr

ここに表示されているのは、1 か月の日数を取得し、その日が稼働日かどうかを確認するための優れた TimesheetBuilder サービス オブジェクトです。結果に基づいて、テーブル内の行は異なる色または他のマークアップを取得します。

うまく機能しますが、これをリファクタリングしてビューをよりシンプルにするにはどうすればよいですか? デコレータでサービス オブジェクトを使用できますか?

4

2 に答える 2

2

ベテランの Rails 開発者である私は、Rails ヘルパーを嫌いがちです。多くのヘルパーが成長すると、混乱する傾向があります。しかし、あなたの考えは正しいです-中間オブジェクトを使用してビジネスロジックをカプセル化してください。Railscastのように独自のソリューションを作成するか、draper などの既製のライブラリを使用できます。詳細については、http: //railscasts.com/episodes/286-draper https://github を参照してください。 com/drapergem/draper

あなたが提案するアプローチを使用することは、ヘルパー内でガベージを作成するよりも優れた OOP/OOD ソリューションであるように感じます。もう 1 つの利点は、クラス内にカプセル化されたロジックをテストする方が、モジュールをテストするよりも少し簡単でクリーンであることです。

于 2013-10-10T12:49:42.160 に答える
2

Rails の規則に従って、ヘルパーに貼り付けます。

  module TimeSheetHelper  #automatically included within TimeSheet views
    def work_day_class(day)
      @timesheet_builder.is_workday?(day_nr) ? "workday" : "non_workday"
    end
  end

その間..あなたの見解に戻ります:

  ...
  %tr.day(class=work_day_class(day_nr))
  ...

于 2013-10-10T12:40:37.363 に答える