用三元运算符表示条件HAML

时间:2012-09-08 12:11:22

标签: ruby sinatra haml

尝试用HAML和Ruby表达这种条件的更紧凑的方式,也许是用三元运算符:

- if @page.nil?
  %br (nothing yet)
- else
  %br #{@page.name}

(根据Neat way to conditionally test whether to add a class in HAML template寻找类似的方法)

您的帮助将不胜感激:)

4 个答案:

答案 0 :(得分:15)

您拥有的代码使文本成为<br>元素的子代;这是不可取的。我认为你真正的意思是:

%br
- if @page.nil?
  (nothing yet)
- else
  #{@page.name}

为此您可以这样做:

%br
#{@page.nil? ? "(nothing yet)" : @page.name}

或者

%br
= @page.nil? ? "(nothing yet)" : @page.name

或者简单地说:

<br>#{@page ? @page.name : "(nothing yet)"}

但是,我个人会在控制器中“修复”这个问题,以便你总是拥有@page,例如:

unless @page
  @page = Page.new( name:"(nothing yet)", … )
end

有了这个,你可以找出一个新/空/无页面的样子,并让你的视图像其他任何一样对待它。您的@page仍然没有@page.id,因此您可以将其用于测试,以决定您是创建新项目还是编辑现有项目。

这就是我处理可能用于创建或编辑项目的所有表单的方法:通过创建(但不添加到数据库)具有默认值的项目来提供默认值。

除此之外:您正在创建一个<br> almost never a good idea,而您正在使用should not be used for content markup的Haml创建它。你可以退一步思考你在做什么。

答案 1 :(得分:1)

简单地说:

%br
= @page.try(:name)

答案 2 :(得分:0)

您还可以嵌入字符串 假设- order_count = 12 %h5= Ordered #{ order_count == 1 ? "1 item" : "#{order_count} items" } for this session

答案 3 :(得分:-1)

%br = @page ? (nothing yet) : #{@page.name}