2016-06-28 11 views
0

Ist es möglich, und wenn ja, wird es vorgeschlagen?Bedingte hinzufügen eine CSS-Klasse in Ansichten, nicht mit erb?

Ich möchte eine Klasse zu einem Element hinzufügen, wenn eine Bedingung wahr ist. Die einzige Art, wie ich herausfinden kann, wie dies zu tun ist erb in der Ansicht mit mir selbst etwas mit wie:

<div <%= if @status == 'success'; "class='do-something'"; end %>> 
    message 
</div> 

oder mit div_for aber es ist chaotisch und ich hatte gesetzt viel eher die Klasse eines HTML-Element ein mit Helfer oder Methoden im Modell/Controller selbst. etwas wie:

Wenn die Aktion erfolgreich ist, suchen Sie das HTML-Element irgendwie (nach Datenattribut, nach Klasse usw.) und fügen Sie eine Klasse hinzu.

+0

Haben Sie versucht, es mit Javascript tun? –

+0

Ja, das ist sicherlich eine Option, dachte nur, es muss eine Schiene Weg, um es zu tun, anstatt meine Ansichten zu verstopfen. –

Antwort

0

Es gibt viele Möglichkeiten zu tun, was Sie wollen. Hier ist eine:

<%= content_tag :div, message, class: ("do-something" if @status == "success") %> 

Wenn Sie es einen Helfer machen wollen, das ist einfach zu:

def message(status, message=nil, &block) 
    css_class = "do-something" if @status == success 
    if block 
    content_tag(:div, class: css_class, &block) 
    else 
    content_tag(:div, message, class: css_class) 
    end 
end 

Dann:

<%= message @status do -%> 
    Message 
<% end %> 

Oder:

<%= message @status, "Message" %> 
+0

Lieber Downvoter: Bitte hinterlassen Sie einen Kommentar, der den Grund für Ihren Downvote erklärt. Wenn meine Antwort fehlt, würde ich die Gelegenheit schätzen, sie zu verbessern. –

+0

Der 'Nachricht'Helfer in meiner Antwort verwendet nicht ERB, und OP schrieb" Ich würde viel lieber die Klasse eines HTML-Elements * mit Hilfe eines Helfers * ... setzen ", also würde ich sagen, meine Antwort adressiert ziemlich direkt was wurde gefragt. –

+0

Sicher, Ihre Lösung sieht so aus, als ob sie ERB zu mir benutzt, so weit ich das beurteilen kann, geht sie nicht auf die gestellte Frage ein. Vermutlich möchte der Op die Ansicht nicht durchsuchen und irgendwo ERB einfügen, wo die Klasse geändert werden muss, und er muss daran denken, ERB in zukünftige Erweiterungen der Ansicht einzufügen. Wenn ich Ihren Code falsch interpretiert habe, lassen Sie es mich wissen, und ich ändere meinen Downvote. – 7stud

-2

Dies sollte Arbeit

<div class=<%= @status == 'success' ? 'do-something' : '' %>> 
</div> 
0

Bedingtes eine CSS-Klasse in Ansichten hinzufügen, nicht erb mit?

Sie die Ansicht mit Nokogiri analysieren kann, ändern Sie dann die html:

def some_action 
    status = 'success' 
    @planet = 'mars' #ERB variable 

    if status == 'success' 
     html = render_to_string #The view after executing the ERB 
           #and applying the ERB variables and 
           #adding the layout. 

     doc = Nokogiri::HTML html 
     target_class = 'title' 

     tags_containing_target_class = doc.xpath(
     "//*[contains(concat(' ', normalize-space(@class), ' '), ' #{target_class} ')]" 
    ) #A well known method to search a class like class="title bold" 
     #or class="bold title" 

     class_to_add = 'highlight' 

     tags_containing_target_class.each do |tag| 
     tag['class'] = tag['class'] << " #{class_to_add}" 
     end 

     render text: doc.to_html 
    end 
    end