Відповіді:
Враховуючи рейки 3:
html_safe
насправді "встановлює рядок" як HTML Safe (це трохи складніше, ніж це, але в основному це). Таким чином, ви можете повернути рядки HTML Safe з помічників або моделей за бажанням.
h
можна використовувати лише зсередини контролера або перегляду, оскільки це від помічника. Це змусить уникнути виходу. Це насправді не застаріло, але ви, швидше за все, більше не будете використовувати його: єдине використання - це "повернути" html_safe
декларацію, досить незвично.
Попередження вашого вираження за допомогою raw
насправді еквівалентно виклику, to_s
прив'язаному до html_safe
нього, але оголошується на помічнику, як і у випадку h
, тому його можна використовувати лише для контролерів та представлень.
" SafeBuffers and Rails 3.0 " - це приємне пояснення того, як працює SafeBuffer
s (клас, який робить 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:NilClass
raw
:
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/…