Ruby on Rails: як надати рядок як HTML?


154

У мене є

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

і на мій погляд erb:

<%= @str %>

Що буде відображатися на сторінці: це <b>Hi</b>те, що я дуже хочу привітати . Який рубіновий спосіб "інтерпретувати" рядок як розмітку 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 .


Фантастичний. Я не міг знайти, як це зробити навіть після пошуку години. Дякую за вашу відповідь.
Саліл

1
Я завжди користувався raw. Дуже рада про це знати!
jmcharnes

Давати ханки з майбутнього =)
Карлос Моралес

1
Sanitize видаляється згідно stackoverflow.com/questions/44575106 / ...
Юнесс

16

Вживати сировину :

<%=raw @str >

Але як правильно говорить @ jmort253, подумайте, куди насправді належить HTML.


Привіт, це рішення працює, за винятком одного застереження: дивіться відредаговане запитання
Тим



7

Ви змішуєте свою бізнес-логіку зі своїм вмістом. Натомість я рекомендую надсилати дані на вашу сторінку, а потім використовувати щось на зразок JQuery, щоб розмістити дані там, де вам потрібно.

Це має перевагу зберігати весь ваш HTML на сторінках HTML, де він належить, щоб ваші веб-дизайнери могли змінити HTML пізніше без необхідності вводити код на стороні сервера.

Або якщо ви не хочете використовувати JavaScript, ви можете спробувати це:

@str = "Hi"

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

Принаймні таким чином ваш HTML знаходиться на сторінці HTML, де він належить.


Проблема полягає в тому, що моя програма бере файл, який позначається погано, і "переводить" його через регекси в хорошу розмітку HTML для надсилання до представлення. Отже, розмітка HTML, що створюється, є динамічною, тому я не можу апріорі знати, які теги повинні оточувати @str. Де я б виконував цю «перекладацьку» роботу, якби не в моделях? Я думав, що ми не повинні мати широкий логічний код у видах.
Тім

1
Це справді питання думки. Розробляючи свіжий додаток, я вважаю за краще тримати все максимально чисто. Але часто ми повинні працювати в межах обмежень того, що нам залишили інші. Якщо ваш джерело даних повертає HTML-розмітку, можливо, погляньте на використання "сировини", як описано в рішенні Майкла Стума.
jmort253

1
Якщо ви успадкували підтримку якогось коду, а в коді є сфери, які демонструють неякісне мислення чи дизайн, то це дійсно є вашою відповідальністю за його очищення, щоб зробити його більш ретельним. Залишати його так, як ви виявили, це добре, коли це чудовий код для початку, але залишати його краще, ніж ви вважали, що це добре, коли йому потрібна робота. Частина моєї роботи - управління деякими застарілими програмами; Я фанат не фіксувати речі, які не порушені, але їх не можна було легко покращити через те, як вони написані. Мені довелося переписати більшість функціональних викликів, але зараз набагато простіше працювати.
Олов'яний чоловік

Ви не повинні використовувати JavaScript для інтерполяції HTML, якщо немає інших причин використовувати JS. Це порушить ваш веб-сайт для веб-переглядачів, що не належать до JS (так, їх є ).
Marnen Laibow-Koser

1
Звичайно, якщо ви дозволите, що вміст, який не вийшов, відповідав на те, щоб забезпечити розмітку не злого.
Макаріо

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 - це фактичний вміст у діві, правда? тобто у прикладі це було б "Привіт, світ!"? Що робити, якщо translation_text містить більше HTML, тобто вкладених знаків або прольотів? Чи довелося б мені тоді багато разів дзвонити content_tag?
Тім

і ... вибачте, натисніть кнопку, введіть рано ... кожен вкладений div / span всередині все ще є content_tag, і вам все одно потрібно перевірити його, хоча правильно? Оскільки ми не можемо побачити, що ви робите з вашим фантазійним перекладом ;-), я б припустив, що ви шукаєте ВСІ теги, незалежно від того, чи є регулярний вираз на "батьківському" HTML-файлі ... наприклад <ul>. Ви б не ставили всі лі як велику дупу для друку, чи не так? у кожного буде власний content_tag: li, текст правильний?
пігмер

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? %
>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.