重构:视图中的服务对象

时间:2013-10-10 12:28:10

标签: ruby-on-rails refactoring

我有一个很棒的工作时间表应用程序。现在一切都运行正常,这是重构时间!特别是一些观点非常复杂。所以我想开始使用装饰器来清理它们。

另一件事是我使用了相当数量的服务对象。虽然它们很棒并且保持我的模型清洁,但在我的视图中使用它们并不是我想要的。我在这里寻找一些重构建议。让我们考虑以下视图代码片段:

  .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

你看到的是一个伟大的TimesheetBuilder服务对象,可以获得一个月内的日子并检查一天是否是工作日。根据结果​​,表中的一行获得不同的颜色或其他标记。

效果很好,但是如何重构它以使视图更简单?我可以在装饰器中使用服务对象吗?

2 个答案:

答案 0 :(得分: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))
  ...

答案 1 :(得分:2)

作为一名经验丰富的Rails开发人员,我倾向于不喜欢Rails助手。当一些帮助者增长时,它往往变得一团糟。但您的想法是正确的 - 使用中间对象来封装您的业务逻辑。您可以创建自己的解决方案,例如here in Railscast 或者您可以使用一些现成的库,如draper,请参阅以下内容以获取更多信息: http://railscasts.com/episodes/286-draper https://github.com/drapergem/draper

我觉得使用方法你建议使用更好的OOP / OOD解决方案而不是在帮助器内部制作垃圾。另一个好处是,我发现封装在类中的测试逻辑比测试模块更容易和更清晰。