Відповіді:
Враховуючи рейки 3:
html_safeнасправді "встановлює рядок" як HTML Safe (це трохи складніше, ніж це, але в основному це). Таким чином, ви можете повернути рядки HTML Safe з помічників або моделей за бажанням.
hможна використовувати лише зсередини контролера або перегляду, оскільки це від помічника. Це змусить уникнути виходу. Це насправді не застаріло, але ви, швидше за все, більше не будете використовувати його: єдине використання - це "повернути" html_safeдекларацію, досить незвично.
Попередження вашого вираження за допомогою rawнасправді еквівалентно виклику, to_sприв'язаному до html_safeнього, але оголошується на помічнику, як і у випадку h, тому його можна використовувати лише для контролерів та представлень.
" SafeBuffers and Rails 3.0 " - це приємне пояснення того, як працює SafeBuffers (клас, який робить html_safeмагію).
hколи-небудь буде застарілим. Використання "Hi<br/>#{h@ user.name}".html_safeє досить поширеним та прийнятим.
rawі html_safeна практиці є тонка різниця : raw(nil)повертає порожній рядок, а nil.html_safeвикидає виняток.
hне "поверне" декларацію html_safe. Коли рядок є html_safe, hнічого не зробить.
Я думаю, це повторює: html_safeчи не виходить HTML-код у вашому рядку. Насправді це запобіжить уникненню рядка.
<%= "<script>alert('Hello!')</script>" %>
поставить:
<script>alert('Hello!')</script>
у свій HTML-код (так, так безпечно!), хоча:
<%= "<script>alert('Hello!')</script>".html_safe %>
з'явиться діалогове вікно сповіщення (ви впевнені, що саме цього ви хочете?). Тому ви, мабуть, не хочете дзвонити html_safeна будь-які введені користувачем рядки.
html_safeце НЕ уникнути ні екранування в . Хоча кінцевий результат позначення чогось як не безпечного HTML, а потім використання непрямого скасування ERB <% = тега, може бути таким же, як дані про нерозмітнення та повторне звільнення від нього на виході, функціонально він не робить жодного. Начебто різниця (6 * -1 * -1), проти 6.
Різниця між рейками 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 ".
html_safe :
Позначає рядок як надійний безпечний. Він буде вставлений у HTML, не виконуючи додаткових додатків.
"<a>Hello</a>".html_safe
#=> "<a>Hello</a>"
nil.html_safe
#=> NoMethodError: undefined method `html_safe' for nil:NilClassraw :
rawце просто обгортка навколо html_safe. Використовуйте, rawякщо є шанси, що рядок буде nil.
raw("<a>Hello</a>")
#=> "<a>Hello</a>"
raw(nil)
#=> ""hпсевдонім для html_escape:
Корисний метод для втечі символів тегів HTML. Використовуйте цей метод, щоб уникнути будь-якого небезпечного вмісту.
У Rails 3 і вище він використовується за замовчуванням, тому вам не потрібно використовувати цей спосіб явно
Найкращий безпечний спосіб: <%= sanitize @x %>
Це дозволить уникнути XSS!
Простіше кажучи:
h видаліть HTML-теги в числових символів, щоб візуалізація не порушила ваш HTML
html_safe встановлює булевий рядок у рядку, щоб рядок розглядався як збереження html
raw Він перетворює html_safe в рядок
hє html_safe, що означає, що HTML відображається як є.
<%== @x %>що це псевдонім<%= raw(@x) %>edgeguides.rubyonrails.org/…