Ruby on Rails : 문자열을 HTML로 렌더링하는 방법?


154

나는 가지고있다

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

그리고 erb 관점에서 :

<%= @str %>

페이지에 표시되는 것은 : <b>Hi</b>내가 정말로 원하는 것은 Hi 입니다. 문자열을 HTML 마크 업으로 "해석"하는 루비 방법은 무엇입니까?


편집 : 경우

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

내 견해로는

<%raw @str %>

HTML 소스 코드는 <span class=\"classname\">hello</span> 내가 정말로 원하는 위치입니다 <span class="classname">hello</span>(큰 따옴표를 이스케이프 처리 한 백 슬래시 없음). 큰 따옴표를 "이스케이프 제거"하는 가장 좋은 방법은 무엇입니까?


문자열 이스케이프에 % Q [] 구문을 사용할 수도 있습니다. 예 : %Q["quotation marks"] => "\"quotation marks\"" 출처 : en.wikibooks.org/wiki/Ruby_Programming/Syntax/… 이것이 도움이되는지 모르겠습니다.
0112

답변:


328

최신 정보

보안상의 이유로 sanitize대신 사용 하는 것이 좋습니다 html_safe. 링크


무슨 일이 일어나고 있는지, 보안 조치로 Rails는 악성 코드가 포함되어 있기 때문에 문자열을 피하고 있습니다. 그러나 Rails에 문자열이이라고 알려 html_safe주면 바로 전달됩니다.

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

또는

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

사용 raw은 잘 작동하지만 문자열을 문자열로 변환 한 다음 html_safe를 호출하면됩니다. 문자열이 있다는 것을 알면 불필요한 단계를 건너 뛰고 진행 상황을 명확하게하기 때문에 html_safe를 직접 호출하는 것이 좋습니다. 문자열 이스케이프 및 XSS 보호에 대한 자세한 내용은 이 Asciicast에 있습니다.


환상적인. 한 시간 동안 검색 한 후에도 그렇게하는 방법을 찾지 못했습니다. 답변 주셔서 감사합니다.
Salil

1
나는 항상 사용했습니다 raw. 이것에 대해 알게되어 매우 기쁩니다!
jmcharnes

미래에서 행크를주는 =)
Carlos Morales


16

raw 사용 :

<%=raw @str >

그러나 @ jmort253이 올바르게 말한 것처럼 HTML이 실제로 속한 곳을 고려하십시오.


안녕,이 솔루션은 한 가지 경고를 제외하고 작동합니다 : 편집 된 질문을 참조하십시오
Tim



7

비즈니스 로직과 컨텐츠를 혼합하고 있습니다. 대신 데이터를 페이지로 보낸 다음 JQuery와 같은 것을 사용하여 필요한 곳에 데이터를 배치하는 것이 좋습니다.

이는 웹 디자이너가 서버 측 코드를 따르지 않고 나중에 HTML을 수정할 수 있도록 모든 HTML을 HTML 페이지에 유지하는 이점이 있습니다.

또는 JavaScript를 사용하지 않으려면 다음을 시도하십시오.

@str = "Hi"

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

적어도이 방법으로 HTML은 HTML이 속한 HTML 페이지에 있습니다.


문제는 내 앱이 제대로 표시되지 않은 파일을 가져 와서 정규 표현식을 통해 HTML 태그로보기로 전송하여 "번역"하는 것입니다. 따라서 생성되는 HTML 마크 업은 동적이므로 @str을 둘러싸는 태그를 우선적으로 알 수 없습니다. 모델에없는 경우이 "번역"작업을 어디에서 수행합니까? 나는 우리가 관점에서 광범위한 논리 코드를 가져서는 안된다고 생각했다.
Tim

1
정말 의견의 문제입니다. 새로운 앱을 개발할 때는 모든 것을 최대한 깨끗하게 유지하는 것이 좋습니다. 그러나 종종 우리는 다른 사람들이 우리에게 남겨둔 것들의 제약 내에서 일해야합니다. 데이터 소스가 HTML 마크 업을 반환하는 경우 Michael Stum의 솔루션에 설명 된대로 "raw"를 사용하는 것을 살펴보십시오.
jmort253

1
일부 코드에 대한 지원을 물려 받았고 코드에 잘못된 생각이나 디자인을 보여주는 영역이있는 경우 코드를 유지 관리하기 쉽게 정리하는 것은 사용자의 책임의 일부입니다. 처음에는 코드가 좋을 때 찾은 그대로 두는 것이 좋지만 작업이 필요할 때 찾은 것보다 더 나은 상태로 두십시오. 내 직업의 일부는 일부 레거시 앱을 관리하는 것입니다. 나는 깨지지 않은 것들을 고치지 않는 팬이지만, 그것들이 어떻게 쓰여졌 기 때문에 쉽게 향상시킬 수 없었습니다. 대부분의 함수 호출을 다시 작성해야했지만 지금 작업하는 것이 훨씬 쉽습니다.
Tin Man

JS를 사용할 다른 이유가없는 경우 HTML 보간에 JavaScript를 사용하지 않아야합니다. JS가 아닌 브라우저의 경우 사이트가 손상됩니다 (예, 일부 있습니다).
Marnen Laibow-Koser

1
물론 이스케이프되지 않은 콘텐츠를 허용하는 경우 비악의 마크 업을 보장하는 것은 전적으로 귀하에게 달려 있습니다.
Macario 2016 년

6

또는 CGI.unescapeHTML 메서드를 사용해 볼 수 있습니다 .

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

0

번역하고 사람의 엉터리 코드 파일에서 원하는 코드를 선택하기 때문에 정규 표현식과 함께 content_tag를 사용할 수 있습니까?

API 문서를 훔치면이 번역 된 코드를 다음 content_tag과 같이 보간 할 수 있습니다 .

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

코드를 모르는 경우 이런 종류의 사고는 번역 된 코드가 너무 호환되는지 확인합니다.


translate_text가 div 내의 실제 내용이라고 가정합니다. 예를 들어, "Hello world!"입니까? translation_text에 더 많은 HTML이있는 경우 (예 : 중첩 된 div 또는 범위)? 그런 다음 content_tag를 여러 번 호출해야합니까?
Tim

그리고 ... 미안 타를 일찍 입력하십시오 ... 각 중첩 된 div / span은 여전히 ​​content_tag이며 여전히 올바른지 확인해야합니까? 우리가 당신의 멋진 번역 ;-)으로 무엇을하고 있는지 알 수 없으므로 정규 표현식이 HTML의 '부모'에 있는지 여부에 관계없이 <ul>과 같은 모든 태그를 찾는 것으로 가정합니다. 모든 리를 큰 엉덩이 끈처럼 인쇄하지 않겠습니까? 각각은 고유 한 content_tag : li, text 맞습니까?
pjammer

0

@str = "<span class=\"classname\">hello</span>" 내 견해로는

<%raw @str %> HTML 소스 코드는 <span class=\"classname\">hello</span>실제로 원하는 위치입니다 <span class="classname">hello</span>(큰 따옴표를 이스케이프 처리 한 백 슬래시 없음). 큰 따옴표를 "이스케이프 제거"하는 가장 좋은 방법은 무엇입니까?

해결 방법 : 백 슬래시로 이스케이프되지 않도록 작은 따옴표 안에 큰 따옴표를 사용하십시오.

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

0

html_safe 버전은 Rails 4에서 잘 작동합니다 ...

<%= "<center style=\"color: green; font-size: 1.1em\" > Administrators only </center>".html_safe if current_user.admin? %
>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.