Expressing conditional HAML possibly with ternary

2020-04-05 08:56发布

Trying to come up with a more compact way of expressing this conditional in HAML and Ruby, perhaps with a ternary operator:

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

(looking for similar approach as per Neat way to conditionally test whether to add a class in HAML template)

Your help would be appreciated :)

4条回答
女痞
2楼-- · 2020-04-05 09:27

Simply do:

%br
= @page.try(:name)
查看更多
我只想做你的唯一
3楼-- · 2020-04-05 09:32

The code you have makes the text a child of the <br> element; that is not desirable. What you really meant, I think, was:

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

For this you can simply do:

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

Or

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

Or simply:

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

However, personally I would 'fix' this in the controller so that you always have a @page, with something like:

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

With this you can stub out what a new/empty/nothing page looks like and let your view treat it like any other. Your @page still won't have a @page.id, so you can use that for tests to decide if you are creating a new item or editing an existing one.

This is how I handle all my forms that may be used to create or edit an item: provide defaults by creating (but not adding to the database) an item with the default values.

Aside: You're creating a <br> which is almost never a good idea, and you're creating it with Haml which should not be used for content markup. You might step back and think about what you're doing.

查看更多
趁早两清
4楼-- · 2020-04-05 09:33
%br = @page ? (nothing yet) : #{@page.name}
查看更多
姐就是有狂的资本
5楼-- · 2020-04-05 09:37

You can also embed in a string assuming - order_count = 12: %h5= Ordered #{ order_count == 1 ? "1 item" : "#{order_count} items" } for this session

查看更多
登录 后发表回答