2017-02-26 2 views
0

Ich verwende rails und materialize toasts für die Anzeige von Flash-Nachrichten. Hier ist der Code, ist mitzeigen verschiedene Toast für jeden Blitz in Schienen

<% unless flash.empty? %> 
    <script> 
     <% flash.each do |f| %> 
     <% type=f[0].to_s.gsub('alert', 'red').gsub('warning', 'deep-purple').gsub('success', 'green') %> 
     Materialize.toast('<%= f[1] %>', 4000, '<%= type %>') 
     <% end %> 
    </script> 
<% end %> 

Das Problem ist, dass diese Gewohnheit split die flash messages-different toasts zeigt stattdessen alle in einem single toast. Wie kann ich jedes flash in seinem eigenen anzeigen lassen?

Antwort

1

Flashes sind in einem Hash von Typ/Wert neu gruppiert. Ich schlage vor, dass Sie einen Helfer erstellen, um Ihre Präsentationstags für Blitze zu wickeln

Der Wert eines Flash könnte sehr gut eine einzelne Zeichenfolge oder ein Array oder Zeichenfolgen sein. Ich persönlich benutze einen Wrapper um Flash, der mich so viele Blitze wie ich möchte auf den gleichen Typ drücken kann

Der folgende Code behandelt Zeichenfolge oder Array blinkt. Beachten Sie die flash.each do |type, content|

def flashes 
    content_tag(:div, class: 'flash-group') do 
    flash.each do |type, content| 
     if content.respond_to?(:each) 
     # If you have an array of flashes, regroup them under the same "flash" block 
     concat(single_flash(type, flash) do 
      # The flash messages are added as a list 
      content_tag(:ul) do 
      content.flatten.each do |message| 
       msg = if message.respond_to?(:html_safe) 
       message.html_safe 
       else 
       msg 
       end 
       concat(content_tag(:li, msg)) 
      end 
      end 
     end) 
     else 
     concat(single_flash(type, content.html_safe)) 
     end 
    end 
    end 
end 

Dieser Wrapper irgendwie Rahmen unabhängig ist und Sie können single_flash definieren, wie Sie wollen, und verwenden Sie nur <%= flashes %> in Ihrem Layout.

Für Ihre materielle Implementierung würden Sie so etwas wie

def single_flash(type, content = nil) 
    type_class = case type 
    when 'alert' 
    'red' 
    when 'warning' 
    'deep-purple' 
    when 'success' 
    'green' 
    else 
    '?' 
    end 
    Materialize.toast(content, 4000, type_class) 
end 

Zum Beispiel meine Bootstrap-Implementierung

# Render a single flash, styles according to the flash type 
    def single_flash(type, content = nil) 
    alert_class = ['alert alert-dismissible media'] 
    contextual_class = case type.to_sym 
    when :alert, :danger, :error, :fatal 
     'danger' 
    when :warning, :todo 
     'warning' 
    when :notice, :success 
     'success' 
    else 
     'info' 
    end 
    alert_class << "alert-#{contextual_class}" 
    close_class = "close text-#{contextual_class}" 
    content_tag(:div, class: alert_class, role: 'alert') do 
     concat(content_tag(:div, class: 'flash-icon media-left media-middle') do 
     font_awesome(case type.to_sym 
     when :fatal, :error 
      'exclamation-triangle' 
     when :danger, :warning 
      'exclamation-triangle' 
     when :success 
      'check' 
     when :notice, :info 
      'info-circle' 
     else 
      'question' 
     end) 
     end) 
     concat(content_tag(:div, class: 'flash-message media-body') do 
     block_given? ? yield : simple_format(content) 
     end) 
     concat(content_tag(:div, class: 'media-right media-middle') do 
     concat(content_tag(:button, class: close_class, 'data-dismiss': 'alert') do 
      concat(content_tag(:span, aria_hidden: true) {'&times;'.html_safe }) 
      concat(content_tag(:span, class: 'sr-only') { 'Close' }) 
     end) 
     end) 
    end 
    end 
haben
Verwandte Themen