我有一个很棒的工作时间表应用程序。现在一切都运行正常,这是重构时间!特别是一些观点非常复杂。所以我想开始使用装饰器来清理它们。
另一件事是我使用了相当数量的服务对象。虽然它们很棒并且保持我的模型清洁,但在我的视图中使用它们并不是我想要的。我在这里寻找一些重构建议。让我们考虑以下视图代码片段:
.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服务对象,可以获得一个月内的日子并检查一天是否是工作日。根据结果,表中的一行获得不同的颜色或其他标记。
效果很好,但是如何重构它以使视图更简单?我可以在装饰器中使用服务对象吗?
答案 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解决方案而不是在帮助器内部制作垃圾。另一个好处是,我发现封装在类中的测试逻辑比测试模块更容易和更清晰。