Expressing conditional HAML possibly with ternary operator

余生颓废 提交于 2019-12-19 18:21:30

问题


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 :)


回答1:


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.




回答2:


Simply do:

%br
= @page.try(:name)



回答3:


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




回答4:


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


来源:https://stackoverflow.com/questions/12330627/expressing-conditional-haml-possibly-with-ternary-operator

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!