2017-04-06 2 views
0

Ich baue gerade eine Ruby on Rails App mit HAML als Vorlagensprache. Ich möchte eine Bedingung erstellen, die ein Tag abhängig davon definiert, ob es erfüllt ist oder nicht, andernfalls definiert es ein anderes Tag. Ich weiß, ich könnte dies wie schreiben:HAML bedingte Tags

- if ordered 
    %ol 
- else 
    %ul 

Aber das ist nicht besonders trocken, und würde mich erfordert den Großteil des Codes zu duplizieren. Gibt es einen einfachen Weg, um dieses Problem zu umgehen? Sollte ich in Rubin Logik suchen, um es zu finden?

Danke

Antwort

0

Wenn Sie diese Logik in verschiedenen Ansichten dort denke ich tun müssen, sind zwei Ansätze können Sie wie folgt vor:

1. einen Teil machen, und es machen wo du das brauchst. Wenn Sie Variablen müssen passieren verwenden local_assigns

_my_list.html.haml

- if ordered 
    %ol 
- else 
    %ul 

es verwenden

render 'partials/my_list', ordered: ordered 

2. Machen Sie Ihren eigenen Helfer

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 

Verwendung es

= my_list(ordered) 

Sie können außerhalb der Ansicht, Ihre bestellten Variable halten und mit der ganzen Logik innerhalb der Helfer beschäftigen.

Wenn Sie sich fragen, was zu verwenden ist, ist die erste Antwort von here ziemlich gut.

0

Definieren Sie einen Helfer. Wir werden die Option ordered vorstellen, um das Tag auszuwählen, der Rest wird an das Tag übergeben.

# 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 

Und dann

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