【问题标题】:Mix HTML and non-HTML strings in Rails ERB在 Rails ERB 中混合 HTML 和非 HTML 字符串
【发布时间】:2015-07-24 14:55:24
【问题描述】:

我有一个文本区域,一些用户可以在其中输入 HTML(请不要对此不安全发表评论,我已经采取了净化对策)。

现在,我想展示一个我的用户可以编写的 html 代码示例。如何使用 ruby​​ 在我的 .erb 模板文件中执行此操作?

最终用户的视觉输出应该是这样的(没有语法高亮,尊重换行符!)

my_example_string

Here is an example of sample code you can write in the text-area:
<p>Hello, dear Mr. X, new announcement</p>
<br>
<h2>The project</h2>
<p>blablabla</p>
<h2>Your role</h2>
<p>...</p>

EDIT :实际的 HTML 输出看起来像

<p>
        Here is an example of sample code you can write in the text-area: !&lt;/p&gt;
&lt;p&gt;Hello, dear Mr. X, new announcement;/p&gt;
&lt;h2&gt;The project&lt;/h2&gt;
&lt;p&gt;Blablabla&lt;/p&gt;
...
</p>

我尝试过类似的东西

<%= 'Here is an example of sample code you can write in the text-area:' +'<br>'.html_safe + 
    '<br>' + '<br>'.html_safe + 
    '<p>Hello, dear Mr. X, new announcement</p>'+'<br>'.html_safe + 
    '<h2>The project'</h2>' + ... %>

但输出看起来像(单行)

Here is an example of sample code you can write in the text-area:<br><br><br><p>Hello, dear Mr. X, new announcement</p><br><h2>The project</h2> 

显然我不能混合.html_safe 和非.html_safe 字符串

有什么想法吗?

编辑 2

我实际上正在使用一个自定义的帮助器/渲染器,它将这个伪工具提示 my_example_string 作为参数

my_view.html.erb

...
<%= render 'shared/field_with_tooltip',
        field: f.text_area(:body, placeholder: '', class: 'form-control', value: (@body if @body)),
        label: 'Body of the message',
        info: my_example_string %>

我的field_with_tooltip 使用这样的信息变量

shared/field_with_tooltip.html.erb

...
<% if info %>
    <p class="text-info field-info"><%= info %></p><br>
<% end %>
...

【问题讨论】:

  • 您能在页面上发布一个应该是什么样子的示例吗? (纯文本很好。)
  • Emm.. 视觉输出是我在第一个代码块中编写的。你的意思是你想要 HTML 输出?
  • 对不起!我正在浏览这个问题并没有意识到!
  • 你们有嵌入代码块的能力吗?如果没有,我今天可以为您提供答案。
  • 还有一点,视觉输出是一个文本块,对吧?不是 已处理 代码(如显示实际标题)?

标签: html ruby-on-rails ruby erb


【解决方案1】:

只需使用 &amp;lt;&amp;gt; 自己编写 HTML 实体,从而避免 Rails 必须完成这项工作:

<%= ('Here is an example of sample code you can write in the text-area:<br>' + 
h('<br>') + '<br>' + 
h('<p>Hello, dear Mr. X, new announcement</p>')+'<br>' + 
h('<h2>The project</h2>') + ...).html_safe %>

这使用 html_escape 帮助器将您要呈现的 HTML 转换为实体,然后您可以在整个结果字符串上调用 html_safe 以避免通常在使用 HTMLSafe 缓冲区时遇到的问题。

我可能会通过完全避免 html_safe 并使用 Rails 所做的内置转义来清理它:

Here is an example of sample code you can write in the text-area:<br>
<%= '<br>' %><br>
<%= '<p>Hello, dear Mr. X, new announcement</p>' %><br>
<%= '<h2>The project</h2>' %>

后一种方法更简洁。

【讨论】:

  • 实际上我正在使用一个辅助函数来显示工具提示/示例,并且它将示例作为字符串参数,这就是为什么我需要您的第一个示例以 h() 方法为特色:D
【解决方案2】:

html_safe 的目的是获取一个普通字符串并将其处理成 HTML,跟随字符串中的标签。比如这是一个check_box元素,标签会被处理成粗体

<%= f.check_box :BLOCK, label: "<strong>Click to enable</strong>".html_safe%>

回顾一下,html_safe 获取了一个包含 HTML 的字符串,并将其处理成工作 HTML。如果没有html_safe,标签将是字符串本身。 (&lt;strong&gt;Click to enable&lt;/strong&gt;)

您是否希望工具提示中的文本由您决定。我不建议这样做,因为对于短文本来说,工具提示通常很小。我建议将示例用户输入放在文本区域元素的左侧或右侧。这样,用户可以在必要时参考它,而无需将鼠标悬停在文本区域上。

无论您的设计如何,以下内容都应该适用于您想要的输出。请注意,我没有使用html_safe,因为您想向用户显示原始代码,而不是处理后的代码。 (意思是,你不想向用户显示标题。)

<p>Here is an example of sample code you can write in the text-area:</p>
<ul style="list-style: none;">
  <li><code><%='<h1>Welcome to my website!</h1>'%></code></li>
  <li><code><%='<p>Here, you can submit code samples.</p>'%></code></li>
  <li><code><%='<p>Just enter your HTML code in the box!</p>'%></code></li>
  <li><code><%='<p>When you are done, hit Submit.</p>'%></code></li>
</ul>

目前,我找不到 ERB 小提琴网站。您可以想象上面的文本看起来与下面的相似。 (SO 编辑器有限):

这是您可以在文本区域中编写的示例代码示例:

&lt;h1&gt;Welcome to my website!&lt;/h1&gt;

&lt;p&gt;Here, you can submit code samples.&lt;/p&gt;

&lt;p&gt;Just enter your HTML code in the box!&lt;/p&gt;

&lt;p&gt;When you are done, hit Submit.&lt;/p&gt;

只是为了比较,如果你使用html_safe,它的外观是这样的:

这是您可以在文本区域中编写的示例代码示例:

欢迎来到我的网站!

在这里,您可以提交代码示例。

只需在框中输入您的 HTML 代码!

完成后,点击提交。

【讨论】:

  • 谢谢,但我实际上使用了一些帮助程序来提供一些工具提示/信息,我需要将我的示例放在单个字符串中,因此使用单个 Ruby 对象
  • 好吧,我会留下这个,因为它回答了你的问题,假设没有帮助。 (你没有在问题中提到助手。)
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2013-07-17
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
相关资源
最近更新 更多