2012-03-19 20 views
9

tôi cần xây dựng này trong mã HAML tôi:HAML - nếu/elsif xây dựng

- if something1 
    %div.a 
- elsif something2 
    %div.b 
- elsif something3 
    %div.c 
- else 
    %div.d 
    %div another content 

tôi sẽ mong đợi tôi nhận được một cái gì đó như:

<div class="a|b|c|d"> 
    <div>another content</div> 
</div> 

Nhưng trong thực tế tôi nhận được

<div class="a|b|c|d"></div> 
    <div>another content</div> 

Tôi phải cập nhật mã của mình như thế nào, nếu tôi cần nhận được:

nội dung khác

?

+0

không phải là một thụt sau khác ? – alexsuslin

Trả lời

8

Tôi nghĩ bạn nên tạo một phương pháp helper thay vì:

%div{:class => helper_method(useful_parameters)} 

Cách thực sự xấu xí để thực hiện điều này là với các nhà khai thác ternary (condition ? true_case : false_case) mà không âm thanh như một giải pháp tốt cho từ thực tế mà bạn đã chọn Haml và muốn có cơ sở mã của bạn sạch sẽ.

+0

Tôi nghĩ rằng khi OP viết 'a | b | c | d', anh ta có nghĩa là anh ta muốn hoặc a, b, c HOẶC d, không phải tất cả chúng cùng một lúc, nhưng câu trả lời của bạn vẫn được áp dụng. – Deleteman

+0

@Deleteman Vào suy nghĩ thứ hai, tôi nghĩ rằng bạn đã đúng. Tôi đã xóa nhận xét vì nó không thêm giá trị. – Candide

+0

@Deleteman bạn nói đúng. ** a ** hoặc ** b ** hoặc ** c ** hoặc ** d **. – user984621

8

@ phương pháp helper Ingenu của trông giống như cách tiếp cận thông minh hơn, nhưng nếu bạn không nhớ nó nhanh hơn và bẩn, bạn có thể làm:

- if something1 
    -divclass = 'a' 
- elsif something2 
    -divclass = 'b' 
- elsif something3 
    -divclass = 'c' 
- else 
    -divclass = 'd' 
%div{:class => divclass} 
    %div another content 
+0

Tốt nhất! Cảm ơn ý tưởng! – user984621

+0

fyi: nếu bạn chỉ muốn bao gồm một lớp trong một trường hợp nhất định và không có gì trong các trường hợp khác, bạn chỉ có thể trả về 'nil' và thuộc tính sẽ không được thiết lập, thay vì thiết lập' class = "" ' – MMachinegun

0

Bạn có thể mở rộng của bạn nếu điều kiện với module này và sau đó sử dụng Smalltalk điều kiện kiểu

module IfTrue 
    def ifTrue &block 
     yield if self 
     slf=self 
     o = Object.new 
     def o.elseIf val, &block 
     yield if !slf && val 
     end 
    end 
    end 

bây giờ bạn có thể mã hóa những thứ như thế này:

condition.extend(IfTrue).ifTrue{ 
    do_stuff 
    }elseIf(condition2){ 
    doOtherStuff 
    } 

hoặc, nếu bạn là một con khỉ nghịch ngợm Patcher ;-):

Object.include IfTrue 

condition.ifTrue{ 
    do_stuff 
}elseIf(condition2){ 
    doOtherStuff 
} 

nếu bạn muốn chuỗi nhiều hơn một elseif bạn sẽ phải thích ứng với mã này bằng cách nào đó Sacombank định nghĩa elsif