1

我在 Sinatra 应用程序的 .haml 模板文件中有以下代码:

- if(@order == 'inverse') 
    - @list.reverse_each do |item| 
        .item
            %span.action-move(data-icon="o")
            .detail.title=item[0]
            .detail.content=item[1]
            %span.action-delete(data-icon="d")
- else 
    - @list.each do |item| 
        .item
            %span.action-move(data-icon="o")
            .detail.title=item[0]
            .detail.content=item[1]
            %span.action-delete(data-icon="d")

如您所见,5 行代码是相同的。有没有一种方法可以重构此代码以避免此处的重复,而无需创建额外的文件作为部分使用?

4

2 回答 2

3

在我的脑海中 - 您可以创建一个临时列表,您将在条件中设置,然后像这样循环遍历临时列表:

- if(@order == 'inverse')
  - temp = @list.reverse
- else 
  - temp = @list
- @temp.each do |item| 
  .item
    %span.action-move(data-icon="o")
    .detail.title=item[0]
    .detail.content=item[1]
    %span.action-delete(data-icon="d")
于 2013-06-04T21:09:24.067 回答
0
- (@order == 'inverse' ? @list.reverse : @list).each do |item| 
  .item
    %span.action-move(data-icon="o")
    .detail.title=item[0]
    .detail.content=item[1]
    %span.action-delete(data-icon="d")

或者,正如@matt 建议的那样:

- (@order == 'inverse' ? @list.reverse_each : @list.each).each do |item| 
  .item
    %span.action-move(data-icon="o")
    .detail.title=item[0]
    .detail.content=item[1]
    %span.action-delete(data-icon="d")
于 2013-06-05T02:05:30.427 回答