Ruby 苗条内联 if

Ruby slim inline if

我正在尝试使用 Ruby Slim 进行内联 if

给出我下面的例子...

- if @droppable
  .panel data-draggable="true"
    span More content here
- else
  .panel
    span More content here

在这两种情况下,唯一的区别是顶级 .panel 元素上存在 data-draggable 属性。 .panel 的内容相同,所以我想完成如下操作:

.panel (@droppable ? data-draggable="true")
  span More content here

有没有办法在 Slim 中实现这一点?

使用dynamic tags:

ruby:
  def panel!
    {tag: 'panel'}.tap do |tag|
      tag[:"data-draggable"] = true if @droppable
    end
  end

*panel!
  span hello

这里不需要if,三元运算符需要三个操作数,而不是两个。

Slim 和 HAML 都设计为省略具有 nil/false 值的属性,有意让您使用 && 运算符将 truthy/falsy 值转换为 存在 具有特定值的属性,或不存在:

修身版:

.panel data-draggable=(@droppable && "true")
  span Hello

在 HAML 中:

.panel{data: {draggable: @droppable && "true"}}
  %span Hello

在这两种情况下,如果 @droppable 是真值,则添加 data-draggable="true",否则将省略该属性。

你不能有 "inline if" ,但你可以通过 slim in line html support 获得你想要的行为 这样做:

<div class="cool_class"       
  - if conditional_is_met
    | data="must_be_added"
    | special_data="#{@my_data.to_json}" 
  |          
</div>

请考虑在 html 标签内仍然遵循 slim identation。 最后的 | 对于关闭 if.

很重要