원시 대 html_safe 대 h를 사용하여 HTML을 이스케이프 처리하지 않기


323

다음 문자열이 있다고 가정하십시오.

@x = "<a href='#'>Turn me into a link</a>"

내보기에는 링크가 표시되기를 원합니다. 즉, @x의 모든 항목이 이스케이프 처리되지 않고 문자열로 표시되는 것을 원하지 않습니다. 사용의 차이점은 무엇입니까

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

?


아무도 그것을 언급하지 않았기 때문에 나는 또한 edgeguides.rubyonrails.org/에<%== @x %> 대한 별칭이 있다고 언급했습니다.<%= raw(@x) %>
CTS_AE

답변:


386

레일 3 고려 :

html_safe실제로 "문자열을 HTML 안전"으로 설정합니다 (이보다 조금 더 복잡하지만 기본적으로 그렇습니다). 이런 식으로 도우미 나 모델에서 HTML Safe 문자열을 마음대로 반환 할 수 있습니다.

h헬퍼가 제공하므로 컨트롤러 또는 뷰 내에서만 사용할 수 있습니다. 출력을 강제로 이스케이프합니다. 실제로 더 이상 사용되지는 않지만 더 이상 사용하지 않을 것입니다. 유일한 사용법은 html_safe선언 을 "되돌아가는 것" 입니다.

식 앞에 접두사를 붙인 raw것은 실제로 to_s체인으로 연결된 호출과 동일 html_safe하지만, 같은 도우미에 선언 h되므로 컨트롤러 및 뷰에서만 사용할 수 있습니다.

" SafeBuffers and Rails 3.0 "은 SafeBuffers ( html_safe매직 을 수행하는 클래스 )의 작동 방식에 대한 좋은 설명입니다 .


42
나는 그것이 h더 이상 사용되지 않을 것이라고 말하지 않을 것입니다 . 사용 "Hi<br/>#{h@ user.name}".html_safe은 매우 일반적이며 사용 이 허용됩니다.
maletor

1
@Maletor 흥미로운 사용법이지만 여전히 "비정상적인"범주에 속한다고 생각합니다.
파티오 바티스타

5
String # html_safe는 실제로 원래 문자열을 감싸고 #html_safe 인 ActiveSupport :: SafeBuffer의 인스턴스를 반환합니다. . 원래 문자열이 #html_safe가되지 않습니까? #html_safe를 호출 한 후
jmaxyz

9
raw그리고 html_safe실제로 는 미묘한 차이가 있습니다 : raw(nil)빈 문자열을 반환 nil.html_safe하고 예외 를 throw합니다.
반 데어 호른

2
hhtml_safe 선언을 "복귀"하지 않습니다. 문자열이 html_safeh경우 아무것도하지 않습니다.
GuiGS

113

반복되는 것으로 생각 합니다. 문자열을 HTML 이스케이프 html_safe하지 않습니다 . 실제로 문자열이 이스케이프되는 것을 방지합니다.

<%= "<script>alert('Hello!')</script>" %>

둘 것이다:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

HTML 소스에 (예, 안전합니다!)

<%= "<script>alert('Hello!')</script>".html_safe %>

경고 대화 상자가 나타납니다 (원하는 것이 확실합니까?). 따라서 html_safe사용자가 입력 한 문자열 을 호출하고 싶지 않을 것입니다 .


81
다시 말해, html_safe는 "이 html을 안전하게 만드십시오"가 아닙니다. 반대입니다. "이 문자열은 html 안전합니다. 약속합니다!"
PaulMurrayCbr

실제로 나는 그것이 실제로 이스케이프 처리 하지 않는지 또는 그것이 to_escape 필요하지 않다는 표시를 만드는지 알아 내기 위해 여기에 왔습니다 . 큰 차이가 있습니다. 음, 그럼 소스 코드를 읽습니다.
Simon B.

"html_safe"의 개념은 문자열의 메타 플래그 일뿐입니다. html_safe그렇지 않은 것으로 표시탈출 하거나 탈출 . HTML 안전 하지 않은 것으로 표시 한 다음 ERB <% = 태그의 암시 적 이스케이프 처리를 사용 하는 최종 결과는 데이터를 이스케이프 해제 한 다음 출력에서 ​​다시 이스케이프 처리하는 것과 동일 할 수 있지만 기능적으로는 수행하지 않습니다. 6 대 (6 * -1 * -1)의 차이와 같은 종류.
벤 Zittlau

46

차이점은 Rails ' html_safe()raw()입니다. Yehuda Katz의 훌륭한 게시물이 있으며 실제로 다음과 같이 요약됩니다.

def raw(stringish)

  stringish.to_s.html_safe

end

예, 입력을 String으로 강제 한 다음 호출 raw()하는 래퍼 입니다. 또한 모듈의 도우미 인 반면 String 클래스의 메서드는 새로운 ActiveSupport :: SafeBuffer 인스턴스를 만드는 메서드입니다.html_safe()html_safe()raw()html_safe()@dirty 플래그 .

" Rails 'html_safe vs. raw "를 참조하십시오 .


30
  1. html_safe :

    문자열을 신뢰할 수있는 안전으로 표시합니다. 추가 이스케이프를 수행하지 않고 HTML에 삽입됩니다.

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
  2. raw :

    raw그냥 래퍼 html_safe입니다. raw문자열이 될 가능성이있는 경우 사용하십시오 nil.

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
  3. h에 대한 별칭 html_escape:

    HTML 태그 문자를 이스케이프 처리하는 유틸리티 메소드입니다. 안전하지 않은 내용을 피하려면이 방법을 사용하십시오.

    Rails 3 이상에서는 기본적으로 사용되므로이 방법을 명시 적으로 사용할 필요가 없습니다



2

Simple Rails 용어로 :

h 렌더링으로 인해 HTML이 손상되지 않도록 HTML 태그를 숫자 문자로 제거

html_safe 문자열이 html 저장으로 간주되도록 문자열에 부울을 설정합니다.

raw html_safe를 문자열로 변환합니다.


his html_safe는 HTML이있는 그대로 렌더링됨을 의미합니다.
Dave Newton

대답은 맞습니다 : h is html_escape ... Rails 코드베이스
notapatch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.