Search code examples
rubysinatrahaml

Expressing conditional HAML possibly with ternary operator


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


Solution

  • 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.