Nối lớp nếu điều kiện là đúng trong Haml


155

Nếu post.published?

.post
  / Post stuff

Nếu không thì

.post.gray
  / Post stuff

Tôi đã thực hiện điều này với người trợ giúp đường ray và nó có vẻ xấu.

= content_tag :div, :class => "post" + (" gray" unless post.published?).to_s do
  / Post stuff

Biến thể thứ hai:

= content_tag :div, :class => "post" + (post.published? ? "" : " gray") do
  / Post stuff

Có một cách đơn giản và haml cụ thể hơn?

CẬP NHẬT. Haml cụ thể, nhưng vẫn không đơn giản:

%div{:class => "post" + (" gray" unless post.published?).to_s}
  / Post stuff

Câu trả lời:


331
.post{:class => ("gray" unless post.published?)}

73
chỉ là một ghi chú bên lề cho nhiều điều kiện `{class: [('class1' trừ khi condition1), ('class2' if condition2)]}` .. vv
Mohammad AbuShady

5
Cô đọng hơn cho nhiều điều kiện:{ class:[ (:class1 if cond1), (:class2 if cond2) ] }
Phrogz

1
Lưu ý: dấu ngoặc đơn là bắt buộc hoặc bạn sẽ gặp lỗi cú pháp ruby.
Topher Fangio

21
- classes = ["post", ("gray" unless post.published?)]
= content_tag :div, class: classes do
  /Post stuff

def post_tag post, &block
  classes = ["post", ("gray" unless post.published?)]
  content_tag :div, class: classes, &block
end

= post_tag post
  /Post stuff

1
Không ngắn gọn, nhưng có vẻ tốt hơn so với các cách khác nếu được đưa vào một người trợ giúp.
Simon Perepelitsa

3
Điều này hoạt động tốt - tôi nhận thấy rằng bạn không cần .compact.join(" ")mặc dù. Bạn chỉ có thể làm:class => ["post active", ("gray" unless post.published?)]
Stenerson

15

Thực sự điều tốt nhất là đưa nó vào một người trợ giúp.

%div{ :class => published_class(post) }

#some_helper.rb

def published_class(post)
  "post #{post.published? ? '' : 'gray'}"
end

Tôi đã đặt cái này trong tệp trợ giúp của mình, nhưng ứng dụng của tôi nói với tôi rằng không có biến "bài".
Simon Perepelitsa

2
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ể đặt nilvà thuộc tính sẽ không được đặt, thay vì cài đặtclass=""
MMachinegun

14

HAML có một cách xây dựng đẹp để xử lý việc này:

.post{class: [!post.published? && "gray"] }

Cách thức hoạt động của điều này là điều kiện được đánh giá và nếu đúng, chuỗi được bao gồm trong các lớp, nếu không nó sẽ không được bao gồm.


5

Cú pháp cập nhật của Ruby:

.post{class: ("gray" unless post.published?)}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.