2015-04-08 8 views
5

Sto imparando sull'integrazione di Devise flash e messaggi di errore con Bootstrap (o nel mio caso Materialize). Ho trovato un articolo sull'argomento all'interno del wiki di Devise (https://github.com/plataformatec/devise/wiki/How-To:-Integrate-I18n-Flash-Messages-with-Devise-and-Bootstrap), quindi capisco come deve funzionare, ma c'era una sezione del codice che ho problemi di comprensione.ruby ​​block che inizia con << - HTML

html = <<-HTML 
<div class="card-panel red lighten-2"> 
    #{messages} 
</div> 
HTML 

html.html_safe 

Qualcuno può spiegare la sintassi <<-HTML? BTW, qui è la funzione completa in caso di necessità contesto

def devise_error_messages! 
return '' if resource.errors.empty? 

messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join 
html = <<-HTML 
<div class="card-panel red lighten-2"> 
    #{messages} 
</div> 
HTML 

html.html_safe 
end 
+2

Si chiama 'qui doc': http: //log.gmarik.info/2007/12/rubys-here-document-heredoc-mini.html –

+0

È fantastico @PrakashMurthy Grazie. – mike0416

+0

BTW, puoi chiamare un metodo su un heredoc: '<< - HTML.html_safe ' – Stefan

risposta

6

Questa è una rubino modo comune per dichiarare una stringa, è molto utile in alcuni casi (edit: http://en.wikipedia.org/wiki/Here_document grazie a @Stefan):

sql = <<-SQL 
    SELECT * FROM users 
    WHERE users.id > 15 
    ORDER BY users.username; 
SQL 
ActiveRecord::Base.connection.execute(sql) 

modo migliore per leggere questo che un semplice:

sql = "SELECT * FROM users WHERE users.id > 15 ORDER BY users.username;" 
ActiveRecord::Base.connection.execute(sql) 

immaginare il dolore di leggere una query SQL molto complesso senza alcuna linea-break! (Come con un manuale di unirsi, ricorsiva, l'unione o vista tabella (s)


Funziona con qualsiasi tipo di parola:!

a_string = <<-WHATEVER 
    This is a string 
    with some line-break 
    to make it more readable 
    #{and_you_can_use_string_interpolation_too} 
WHATEVER 
+2

Non solo un modo Ruby, [heredocs] (http://en.wikipedia.org/wiki/Here_document) esiste in varie lingue – Stefan

+0

Grazie per il chiarimento @Stefan – MrYoshiji

+0

So che Ruby è piuttosto intelligente quando si tratta di interruzioni di riga, ma stai dicendo che poiché è una stringa, la prenderà esplicitamente. Quindi nel tuo esempio, il server non accetterebbe 'sql =" SELECT * FROM \ n WHERE \ n ... '? In' ActiveRecord :: Base.connection.execute (sql)? – mike0416