有没有办法避免haml代码重复而不创建新文件?

时间:2013-06-04 20:42:44

标签: ruby sinatra haml

我在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行代码完全相同。有没有办法可以重构这段代码以避免重复没有创建一个额外的文件用作部分文件?

2 个答案:

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

答案 1 :(得分: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")