【问题标题】:Simpler index views更简单的索引视图
【发布时间】:2015-01-04 08:26:39
【问题描述】:

在 Rails 索引视图中,您迭代集合并显示集合数据中的每个项目。在大多数情况下,我最终会得到一个复杂的视图,因为需要对集合中的特定项目进行额外的计算。这是一个典型的例子:

- if @projects.blank?
  = render "shared/placeholder", colspan: "10"
- else
  - @hours_total = 0
  - @turnover_total = 0
  - @projectusers_total = 0
  - @projects.each do |project|
    - decorate project do |decorates|
      - project_calc = ProjectCalculator.new(project)
      - hours = project_calc.get_project_data("hours")
      - turnover = project_calc.get_project_data("turnover")
      - @hours_total += hours
      - @turnover_total += turnover
      - @projectusers_total += project.projectusers.size
      %tr
        %td= link_to decorates.data_field(project.name), admin_project_path(project)
        %td= decorates.data_field(project.customer.name) unless project.customer.blank?
        %td= decorates.data_field(project.company.name_short)
        %td= decorates.status
        %td= decorates.data_field(project.projectusers.size)
        %td= decorates.decimal(hours)
        %td= decorates.amount(turnover)
        %td= decorates.fixed_price
        %td= decorates.show_progress("hours", "compact", hours)
        %td= decorates.show_progress("turnover", "compact", turnover)

我已经实现的一项改进是使用装饰器来查看特定内容,另一项改进是使用服务对象进行实际计算。

但这里困扰我的是所有的计算。有什么解决方案可以让这个更简单,最好不要在视图中显示?

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    使用 Presenter 怎么样?

    这个链接对我帮助很大:http://robertomurray.co.uk/blog/2014/decorators-presenters-delegators-rails/

    这是另一个简短的概述

    在您的情况下,您可以像这样实现它

    # app/presenter/project_presenter.rb
    class ProjectPresenter
      attr_accessor :project, :project_calculator
    
      def initialize project
        @project = project
        @project_calculator = ProjectCalculator.new
      end
    
      def hours
        project_calculator.get_project_data("hours")
      end
    
      def show_progress *args
        # calculate progress
      end
    end
    

    在您的控制器中,您可以为每个项目初始化演示者

      @projects = Project.all.collect { |project| ProjectPresenter.new(project) }
    

    因此,您的视图可以通过

    访问演示者
      - @projects.each do |project|
        %tr
          %td= project.show_progress('hours')
    

    希望对你有帮助

    小鲍里斯

    【讨论】:

    • 谢谢,这很有帮助。演示者只是装饰者的另一个名字,对吧?
    • 不客气 :-) stackoverflow.com/questions/7860301/… 为您提供了一个很好的概述。一般而言:您使用演示器在“模型和视图”之间架起一座桥梁,而装饰器为模型添加更多功能。
    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2014-09-09
    • 2015-10-10
    • 2022-09-30
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多