2013-05-16 16 views
7

Mam problem podobny do niektórych, które znalazłem na stackoverflow, ale nie do końca taki sam. Chciałbym uniknąć rozwiązania następujące pytanie:Unescaping HAML w atrybucie Hash

https://stackoverflow.com/a/10407782/996587

Zasadniczo chciałby następujące dane wyjściowe HTML:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
</div> 

haml używam wygląda następująco:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT" } 
    Content... 

Nie mogę dokładnie dowiedzieć się, jak uzyskać zawartość tak, jak chcę. Próbowaliśmy stosowania .html_safe na końcu łańcucha, ale uzyskałem następujący błąd:

metoda niezdefiniowany `html_safe” dla «Niecytowany <> & content»: String

Później zrozumiał, że w tym konkretnym zastosowaniu jestem nie używając Railsów, tylko ruby ​​+ HAML. (Odziedziczyłem ten projekt i dopiero zaczynam uczyć się HAML, ruby ​​i Railsów tak czy inaczej)

I znowu, dla tych z was zbyt leniwych, aby kliknąć linki i nie przeczytali rozwiązania, o którym mówiłem, d nie powinien konfigurować HAML, aby nie uniknął attrs dla całego pliku, tylko dla tego jednego atrybutu.

Dzięki!

UPDATE

Właśnie znalazłem: zwykły filtr i był w stanie uzyskać to, co chciałem za pomocą tego. Jeśli jednak istnieje sztuczka, o której nie wiem, więc nie muszę pisać całego kodu HTML, byłbym wdzięczny. Mój "fix":

:plain 
    <div class='myclass' extraattr='UNESCAPED <>& CONTENT'> 
    Content... 
    </div> 
+0

zastosowanie: zwykły łamać spójność haml ... jest tam Coś lepszego? – chfw

Odpowiedz

0

Czy próbowali za pomocą \ uciec znaki.

{ :myattr => '\<\>\&' }

+0

Tak, znaki "ucieczce" powodują ignorowanie odwrotnego ukośnika, ale znak jest uciekany. Próbowałem nawet uciekać z ukośnikiem, ale HAML był szalony. Brak szczęścia :) – thexfactor

4

Nie ma (obecnie) dowolny sposób, aby wyłączyć ucieczki dla pojedynczego atrybutu w haml poza Rails, to wszystko albo nic, używając opcji :escape_attrs. W zależności od tego, co chcesz, warto spojrzeć na :once option.

Kiedy Haml jest używany w Railsach, zastępuje metody ucieczki html z niektórymi, które odnoszą się do wartości html_safe, którą dodaje ActiveSupport (patrz lib/haml/helpers/xss_mods.rb).

Jeśli chcesz, możesz użyć tych metod poza Railsami. Aby to działało, musisz dodać metody html_safe i html_safe? (pamiętaj, że ten przykład jest tylko "nieszczęśliwym" wersją pełnej ochrony XSS, którą zapewnia Rails, to tak naprawdę nie ochroni cię przed z dużej ilości, ale pozwoli selektywnie uniknąć atrybutów).

Dodaj poniższe gdzieś po wymagające haml (może to być najlepszy w oddzielnym pliku, który pobiera wymagane):

class String 
    def html_safe? 
    defined?(@html_safe) && @html_safe 
    end 

    def html_safe 
    @html_safe = true 
    self 
    end 
end 

require 'haml/helpers/xss_mods' 

module Haml::Helpers 
    include Haml::Helpers::XssMods 
end 

Teraz można wykorzystać html_safe na swoich strun i haml nie będzie im uciec:

.myclass{ "extraattr" => "UNESCAPED <>& CONTENT".html_safe, 
      "otherextraattr" => "ESCAPED <>& CONTENT"} 
    Content... 

wyjściowa:

<div class='myclass' extraattr='UNESCAPED <>& CONTENT' otherextraattr='ESCAPED &lt;&gt;&amp; CONTENT'> 
    Content... 
</div>