我将如何使用Presenters ||重构此代码装饰者||波罗斯

时间:2016-05-13 18:28:51

标签: ruby-on-rails ruby

我的代码完美无缺,然而,我知道我的方法不是最佳实践。我很感激任何试图详细解释如何使用(演示者,装饰者或者poros)重构此代码的人的努力 - 我对这两者都没有深刻的理解。 以下是代码:

在我的事件控制器中,我有一个名为tickets_report的方法,如此

def tickets_report @all_bookings = @event.bookings @ticket_types = @event.ticket_types @attendees = @event.attendees end

然后,我在视图中使用@ticket_types实例变量来绘制表格,如下所示:

<tbody>

<% grand_quantity = ticket_left = quantity_sold = total_price = total_amount = 0 %>
<% @tickets.each_with_index do |ticket, index| %> 
    <% remains = ticket.quantity.to_i - ticket.user_tickets.count.to_i 
       amount = ticket.price.to_f * ticket.user_tickets.count.to_i
       grand_quantity += ticket.quantity 
       ticket_left += remains 
       quantity_sold += ticket.user_tickets.count 
       total_price += ticket.price.to_f 
       total_amount += amount 
    %>
    <tr>
            <td><%= index + 1%></td>
            <td><%= ticket.name %></td>
            <td><%= ticket.quantity %></td>
            <td><%= remains %></td>
            <td><%= ticket.user_tickets.count %></td>
            <td><%= number_to_currency(ticket.price)%></td>
            <td><%= number_to_currency(amount)%></td>
          </tr>

<% end %> 
 <tr class="gtotal">  
    <td colspan="2">Grand Total</td>
    <td><%= grand_quantity %></td>
    <td><%= ticket_left %></td>
    <td><%= quantity_sold %></td>
    <td><%= number_to_currency(total_price)%></td>
    <td><%= number_to_currency(total_amount)%></td>
  </tr>
  </tbody>

我的问题是在视图中完成的计算确实不是一件好事,这就是我自己试图解决这个问题的程度

module Events
  class Ticket
    def initialize(ticket)
      @ticket = ticket
    end 

    def name 
      @ticket.name 
    end 

    def quantity 
      @ticket.quantity 
    end 

    def price 
      @ticket.price.to_f 
    end 

    def user_count 
      @ticket.user_tickets.count.to_i 
    end 

    def remains 
      @ticket.quantity.to_i - user_count 
    end 

    def amount 
      price  * user_count 
    end 
  end 

  class TicketReportPresenter < Ticket 
    @@grand_quantity = @@ticket_left = @@quantity_sold = 0 
    @@total_price = @@total_amount = 0 

    def initialize(ticket)
      @ticket = Ticket.new(ticket)
      @@grand_quantity += @ticket.quantity.to_i  
      @@ticket_left += @ticket.remains 
      @@quantity_sold += @ticket.user_count 
      @@total_price += @ticket.price 
      @@total_amount ++ @ticket.amount 
    end 

    class << self 

      def grand_quantity 
        @@grand_quantity
      end 

      def ticket_left 
        @@ticket_left 
      end 

      def quantity_sold 
        @@quantity_sold
      end 

      def total_price 
        @@total_price
      end 

      def total_amount 
        @@total_amount 
      end 
    end    
  end
end

我的控制器中的新tickets_report方法

def tickets_report @all_bookings = @event.bookings @ticket_types = Events::TicketReportPresenter.new(@event.ticket_types.first) @attendees = @event.attendees end

然而,此时似乎没有正确的事情。例如,我无法在我定义的故障单对象上调用ActiveRecord关系。重构视图中存在的逻辑的最佳方法是什么,详细描述和源代码就足以加上其他资源的链接。谢谢。

0 个答案:

没有答案