Rails / Bootstrap / HAML - Как преобразовать этот код для отображения флэш-сообщений в HAML?

2

Я хочу преобразовать следующий код в HAML для обработки предупреждающих сообщений Bootstrap в приложении Rails 4.2.2. Я пробовал вручную, используя html2haml и онлайн-конвертеры, и код, который я получаю, никогда не работает.

Код:

<div class="alert 
    <%= 
    case type.to_sym 
    when :alert, :danger, :error, :validation_errors
        'alert-danger'
    when :warning, :todo
        'alert-warning'
    when :notice, :success
        'alert-success'
    else 
    'alert-info'
    end
    %>
     alert-dismissible" role="alert">
    <button type="button" class="close" data-dismiss="alert"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
    <%= content %>
</div>

Это то, что я получаю от преобразователей:

.alert.case.when.:validation_errors.when.:todo.when.:success.else.end.alert-dismissible{:class => "<haml_loud> type.to_sym :alert, :danger, :error, 'alert-danger' :warning, 'alert-warning' :notice, 'alert-success' 'alert-info' </haml_loud>", :role => "alert"}
  %button.close{"data-dismiss" => "alert", :type => "button"}
    %span{"aria-hidden" => "true"} ×
    %span.sr-only Close
  = content

Я знаю это уродливо, но это единственный код, который я нашел, который работает из коробки с Bootstrap 3.5.5. Если у кого-то есть предложения по новому коду с использованием HAML, я открыт для прослушивания.

1 ответ

5
Лучший ответ

HAML не очень велик, если вы хотите поместить многострочный код Ruby внутри атрибутов элемента HTML. В любом случае это считается плохой практикой, потому что это усложняет ваше мнение, поэтому вместо этого я бы использовал помощник, чтобы упростить представление. Например, вы можете создать файл helpers/alert_helper.rb.

хелперы/alert_helper.rb

module AlertHelper
  def build_alert_classes(alert_type)
    classes = 'alert alert-dismissable '
    case alert_type.to_sym 
    when :alert, :danger, :error, :validation_errors
        classes += 'alert-danger'
    when :warning, :todo
        classes += 'alert-warning'
    when :notice, :success
        classes += 'alert-success'
    else 
        classes += 'alert-info'
    end
  end
end

Тогда, на ваш взгляд, это станет следующим:

Посмотреть

%div{ class: build_alert_classes(type), role: "alert" }
  %button.close{ type: "button", "data-dismiss" => "alert" }
    %span{ "aria-hidden" => true } &times;
    %span.sr-only Close
  = content
  • 3
    эмпирическое правило, если у вас есть логика в вашем представлении, переместите их к помощникам.
  • 0
    Спасибо большое! Я буду использовать помощников с этого момента. Этот код я нашел в Интернете. Я знал, что это было некрасиво, но это был единственный, который работал. Теперь этот новый код, с некоторыми изменениями, работает отлично.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню