user3062123
user3062123

Reputation: 237

HAML conditional tags

I'm currently building a ruby on rails app using HAML as the template language. I'm looking to create a condition that defines a tag dependent on whether it is met or not, otherwise it defines a different tag. I know I could write this like:

- if ordered
  %ol 
- else
  %ul

But this isn't particularly DRY, and would require me to duplicate the bulk of the code. Is there a very straightforward way to get around this problem? Should I be looking into ruby logic to find it?

Thanks

Upvotes: 0

Views: 1844

Answers (3)

Kotti
Kotti

Reputation: 1

You can use the content_tag method as follows. content_tag documentation

= content_tag(ordered ? "ol" : "ul")

If you need it in several occasions you can put that in a helper method

module Listhelper

  def list(ordered, html_options = {})
    = content_tag(ordered ? "ol" : "ul")
  end
end

Call it from the view with = list(your_variables)

Upvotes: 0

radubogdan
radubogdan

Reputation: 2834

If you need to do this logic in different views I think there are two approaches you can follow:

1. Make a partial and render it where you need this. If you need to pass variables use local_assigns

_my_list.html.haml

- if ordered
  %ol 
- else
  %ul

use it

render 'partials/my_list', ordered: ordered

2. Make your own helper

def my_list(ordered)   
  if ordered
    content_tag(:ol, class: 'my-class') do
      # more logic here
      # use concat if you need to use more html blocks
    end   else
    content_tag(:ul, class: 'my-class') do
      # more logic here
      # use concat if you need to use more html blocks
    end   
  end 
end

use it

= my_list(ordered)

You can keep your ordered variable outside of the view and deal with the whole logic inside the helper.

If you ask yourself what to use, well the first answer from here is pretty good.

Upvotes: 0

Amadan
Amadan

Reputation: 198304

Define a helper. We'll introduce the ordered option to pick the tag, the rest are passed on to the tag.

# app/helpers/application_helper.rb
module ApplicationHelper
  def list_tag(ordered: false, **opts)
    kind = ordered ? :ol : :ul
    haml_tag kind, **opts do
      yield
    end
  end
end

And then,

-# some_view.html.haml
%p
  Here's a list:
- list_tag ordered: false, class: 'some_class' do
  - @list.each do |item|
    %li
      = item

Upvotes: 1

Related Questions