raw - html_safe vs. h до unescape html


323

Припустимо, у мене є такий рядок

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

На мій погляд, я хочу, щоб посилання відображалося. Тобто, я не хочу, щоб все в @x було скасовано і відображалося як рядок. Яка різниця між використанням

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

?


Оскільки про це ніхто не згадував, я подумав, що я також зазначу, <%== @x %>що це псевдонім <%= raw(@x) %> edgeguides.rubyonrails.org/…
CTS_AE

Відповіді:


386

Враховуючи рейки 3:

html_safeнасправді "встановлює рядок" як HTML Safe (це трохи складніше, ніж це, але в основному це). Таким чином, ви можете повернути рядки 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є досить поширеним та прийнятим.
малетор

1
@Maletor цікаве використання, хоча я все ще думаю, що він потрапляє до категорії "незвичайних".
Фабіо Батіста

5
Рядок # html_safe насправді повертає екземпляр ActiveSupport :: SafeBuffer, який обертає оригінальну рядок і є #html_safe? . Оригінальний рядок не стає #html_safe? після виклику на нього #html_safe.
jmaxyz

9
Зауважте, що між rawі html_safeна практиці є тонка різниця : raw(nil)повертає порожній рядок, а nil.html_safeвикидає виняток.
Ван дер Хоорн

2
hне "поверне" декларацію html_safe. Коли рядок є html_safe, hнічого не зробить.
GuiGS

113

Я думаю, це повторює: html_safeчи не виходить HTML-код у вашому рядку. Насправді це запобіжить уникненню рядка.

<%= "<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 не потрібно . Зовсім різниця. Ну добре, відчитати вихідний код тоді.
Саймон Б.

Поняття "html_safe" - це лише мета-прапор на рядку. Маркування що - то , як html_safeце НЕ уникнути ні екранування в . Хоча кінцевий результат позначення чогось як не безпечного HTML, а потім використання непрямого скасування ERB <% = тега, може бути таким же, як дані про нерозмітнення та повторне звільнення від нього на виході, функціонально він не робить жодного. Начебто різниця (6 * -1 * -1), проти 6.
Бен Зіттлау

46

Різниця між рейками html_safe()і raw(). Є чудовий пост Єгуди Кац про це, і він справді зводиться до цього:

def raw(stringish)

  stringish.to_s.html_safe

end

Так, raw()це обгортка навколо, html_safe()яка змушує ввести String, а потім викликає html_safe()її. Він також raw()є помічником у модулі, тоді html_safe()як це метод класу String, який створює новий екземпляр ActiveSupport :: SafeBuffer - у ньому є @dirtyпрапор.

Див. " Рейки" 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

Простіше кажучи:

h видаліть HTML-теги в числових символів, щоб візуалізація не порушила ваш HTML

html_safe встановлює булевий рядок у рядку, щоб рядок розглядався як збереження html

raw Він перетворює html_safe в рядок


hє html_safe, що означає, що HTML відображається як є.
Дейв Ньютон

Відповідь правильна: h - html_escape ... з бази коду Rails
notapatch
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.