给定一个字符串,确定它是否来自.html_safe调用



在Ruby on Rails中,给定一个字符串,是否可以确定是否在该字符串上调用了.html_safe?

问这个问题的原因:我想写一个控制器单元测试,验证html_safe是否在特定字符串上调用了而不是,以证明当该字符串稍后被呈现到视图中的页面上时,Rails将对该字符串进行转义(避免可能的XSS漏洞(。

我意识到我可以在测试中实际呈现页面,然后检查呈现的页面主体,但我想知道是否有更直接的方法可以做到这一点?

html_safe?:

s = 'foo'
s.html_safe? #=> false
s = 'foo'.html_safe
s.html_safe? #=> true

请注意,如果您调用"破坏性"方法:,ActiveSupport::SafeBuffer将恢复为不安全

s = 'foo'.html_safe
s.html_safe?  #=> true
s.capitalize! #=> 'Foo'
s.html_safe?  #=> false

.html_safe实际上返回的不是String类型的对象,而是ActiveSupport::SafeBuffer类型的对象(这是String的派生类(。

因此,调用:

my_string.is_a?(ActiveSupport::SafeBuffer)

仅当字符串是而不是调用.html_string的结果时,才会返回false

最新更新