Ruby on Rails: HTML olarak bir dize nasıl oluşturulur?


154

Sahibim

@str = "<b>Hi</b>"

ve benim erb görüşüme göre:

<%= @str %>

Sayfada görüntülenecek olan şey: <b>Hi</b>Gerçekten istediğim şey Merhaba . Bir dizeyi HTML biçimlendirmesi olarak "yorumlamanın" yakut yolu nedir?


Düzenleme : burada

@str = "<span class=\"classname\">hello</span>"

Benim görüşüme göre yaparsam

<%raw @str %>

HTML kaynak kodu <span class=\"classname\">hello</span> gerçekten istediğim yer <span class="classname">hello</span>(çift tırnaklardan kaçan ters eğik çizgiler olmadan). Bu çift tırnak işaretlerini "görünümden çıkarmanın" en iyi yolu nedir?


Ayrıca, dizeden kaçış için% Q [] sözdizimini kullanmayı düşünebilirsiniz. Örn %Q["quotation marks"] => "\"quotation marks\"" : Kaynak: en.wikibooks.org/wiki/Ruby_Programming/Syntax/… Bunun işe yarayıp yaramadığını bilmiyorum.
0112

Yanıtlar:


328

GÜNCELLEME

Güvenlik nedeniyle, sanitizeyerine kullanılması önerilir html_safe. bağlantı


Bir güvenlik önlemi olarak, Rails sizin için dizeden kaçıyor, çünkü içine kötü amaçlı kod gömülmüş olabilir. Ancak Rails'e dizenizin olduğunu söylerseniz html_safe, doğrudan geçecektir.

@str = "<b>Hi</b>".html_safe
<%= @str %>

VEYA

@str = "<b>Hi</b>"
<%= @str.html_safe %>

Kullanılması raweserler cezası, ancak yapıyor bütün html_safe çağırarak sonra bir dizeye dize dönüştürme ve kapanır. Ben bir dize var biliyorum, ben gereksiz bir adım atlar ve ne olup bittiğini daha net yapar, çünkü doğrudan html_safe çağırmayı tercih. Dizeden kaçış ve XSS koruması hakkında ayrıntılar bu Asciicast'ta bulunmaktadır .


Fantastik. Bir saat aradıktan sonra bile bunu nasıl bulamadım. Cevabınız için teşekkürler.
Salil

1
Hep kullandım raw. Bunu bilmek çok sevindim!
jmcharnes

Gelecekten hanks vermek =)
Carlos Morales


16

Çiğ kullanın :

<%=raw @str >

Ancak @ jmort253'ün doğru söylediği gibi, HTML'nin gerçekten nereye ait olduğunu düşünün.


Merhaba, bu çözüm bir uyarı dışında çalışır: lütfen düzenlenmiş soruya bakın
Tim

14

Eğer konum üzerinde railshangi kullanır Erubis - öyle yapmak havalı yolu

<%== @str >

Çift eşit işareti not alın. Daha fazla bilgi için SO ile ilgili soruya bakınız .



7

İş mantığınızı içeriğinizle karıştırıyorsunuz. Bunun yerine, verileri sayfanıza göndermenizi ve ardından verileri gitmeniz gereken yere yerleştirmek için JQuery gibi bir şey kullanmanızı öneririm.

Bu, web tasarımcılarınızın HTML'yi daha sonra sunucu tarafı kodunu dökmek zorunda kalmadan değiştirebilmeleri için tüm HTML'nizi ait olduğu HTML sayfalarında tutma avantajına sahiptir.

Veya JavaScript kullanmak istemiyorsanız bunu deneyebilirsiniz:

@str = "Hi"

<b><%= @str ></b>

En azından bu şekilde HTML'niz ait olduğu HTML sayfasındadır.


Sorun, benim app kötü işaretlenmiş bir dosya alıyor ve görünüme göndermek için iyi HTML işaretleme regexes üzerinden "çeviri". Bu nedenle, oluşturulan HTML biçimlendirme dinamiktir, bu nedenle hangi etiketleri çevreleyen @str. Modellerde olmasaydı bu "çeviri" çalışmasını nerede yapardım? Görüşlerde geniş mantık koduna sahip olmamamız gerektiğini düşündüm.
Tim

1
Gerçekten bir fikir meselesi. Yeni bir uygulama geliştirirken her şeyi olabildiğince temiz tutmayı tercih ediyorum. Ancak çoğu zaman, başkalarının bize bıraktıklarının kısıtlamaları dahilinde çalışmalıyız. Veri kaynağınız HTML işaretlemesi döndürüyorsa, belki de Michael Stum'un çözümünde açıklandığı gibi "raw" kullanmaya bakın.
jmort253

1
Bazı kodların desteğini devralmışsanız ve kodun zayıf düşünme veya tasarım gösteren alanlar varsa, daha sürdürülebilir hale getirmek için bunu temizlemek sizin sorumluluğunuzdadır. Bulduğunuz gibi bırakmak, başlamak için harika bir kod olduğunda iyidir, ancak bulduğunuzdan daha iyi bırakmak, iş gerektiğinde iyi olur. İşimin bir kısmı bazı eski uygulamaları yönetmektir; Kırılmamış şeyleri düzeltmemenin bir hayranıyım, ancak nasıl yazıldıkları nedeniyle kolayca geliştirilemezler. İşlev çağrılarının çoğunu yeniden yazmak zorunda kaldım, ancak şimdi çalışmak çok daha kolay.
Tin Man

JS kullanmak için başka bir neden yoksa HTML enterpolasyonunuz için JavaScript kullanmamalısınız. Yani JS olmayan tarayıcılar (evet, orada sitenizde kıracak olan bazı).
Marnen Laibow-Koser

1
Tabii ki kaçan içeriğe izin verirseniz, kötü işaretlemenin size ait olduğundan emin olmanız size aittir.
Macario

6

Veya CGI.unescapeHTML yöntemini deneyebilirsiniz .

CGI.unescapeHTML "&lt;p&gt;This is a Paragraph.&lt;/p&gt;"
=> "<p>This is a Paragraph.</p>"

0

çeviri yaptığınız ve istediğiniz kodu bir kişinin crappy kodlu dosyasından aldığınız için, regex'lerinizle birleşik olarak content_tag kullanabilirsiniz.

Api dokümanlarından çalmakla, bu çevrilmiş kodu content_tagbenzer şekilde enterpole edebilirsiniz :

<%= content_tag translated_tag_type.to_sym, :class => "#{translated_class}" do -%>
<%= translated_text %>
<% end -%>
# => <div class="strong">Hello world!</div>

Kodunuzu bilmiyorsanız, bu tür bir düşünme çevrilmiş kodunuzun çok uyumlu olmasını sağlayacaktır.


Çevrilen_metnin div içindeki gerçek içerik olduğunu varsayıyorum, değil mi? yani, örnekte, "Merhaba dünya!" Çevrilen_metnin içinde daha fazla HTML varsa, yani iç içe div'ler veya açıklıklar? O zaman content_tag'i birçok kez çağırmam gerekir mi?
Tim

ve ... üzgünüm vurmak erken girin ... içindeki her yuvalanmış div / span hala bir content_tag ve hala doğru olsa doğrulamak gerekir? Süslü çeviri ;-) ile ne yaptığınızı göremediğimiz için, regex, html'nin 'üst' öğesinde olsun ... <ul> olsun, TÜM etiketleri aradığınızı varsayarım. tüm li'leri yazdırmak için büyük bir eşek dizesi olarak koymaz mıydınız? her biri kendi content_tag: li, metin doğru mu?
pjammer

0

@str = "<span class=\"classname\">hello</span>" Benim görüşüme göre yaparsam

<%raw @str %> HTML kaynak kodu <span class=\"classname\">hello</span>gerçekten istediğim yer <span class="classname">hello</span>(çift> tırnak işaretleri kaçan ters eğik çizgiler olmadan). Bu çift tırnak işaretlerini "görünümden çıkarmanın" en iyi yolu nedir?

Çözüm: Ters eğik çizgi ile kaçmayı önlemek için tek tırnak içinde (veya çiftin tek içinde) çift tırnak kullanın.

@str = '<span class="classname">hello</span>'
<%raw @str %>

0

Html_safe sürümü Rails 4'te iyi çalışıyor ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.