【问题标题】:How to render HTML inside Slim templates如何在 Slim 模板中渲染 HTML
【发布时间】:2012-06-11 22:04:01
【问题描述】:

我正在尝试呈现一个带有图标的链接。我正在使用Slim 模板引擎和Bootstrap CSS。

通常你可以这样做:

<a href="#"><i class="icon-user"></i> My Profile</a>

根据 Slim 的文档,我们可以使用 == 来渲染而不转义 HTML。因此,将其翻译为 Slim,我尝试了以下变体:

li== link_to "<i class='icon-user'></i> My Profile", current_user
li== link_to "#{'<i class="icon-user"></i>'.html_safe} My Profile", current_user
li= link_to "#{'<i class="icon-user"></i>'.html_safe} My Profile", current_user

所有变体呈现&lt;a href="/users/1"&gt;&lt;i class="icon-user"&gt;&lt;/i&gt; My Profile&lt;/a&gt; 转义i 标记。

如何阻止 Slim 或 Rails 转义 html?

(Rails 3.2 和 Slim 1.2.1)

【问题讨论】:

    标签: ruby-on-rails ruby slim-lang


    【解决方案1】:

    这个问题已经回答了,但是如果你真的有一些 html 并且你想在一个 slim 模板中渲染它,使用 double equal。

    == "<i>test</i>"
    

    将与

    相同
    = "<i>test</i>".html_safe
    

    【讨论】:

    【解决方案2】:

    您希望为 link_to 参数禁用 HTML 转义,而不是整个 link_to 结果。您与html_safe 非常接近,但您的字符串插值正在吃掉您的“HTML 安全”标志。这应该会更好:

    li= link_to '<i class="icon-user"></i> My Profile'.html_safe, current_user
    

    【讨论】:

      【解决方案3】:

      或者,你可以这样写

      li
        a href=url_for(current_user)
          i.icon-user My Profile
      

      这可以说是更容易阅读。

      【讨论】:

      • 补充一点,如果你有一个属性值应该被呈现为安全的 html,使用双“=”:span data-icon==icon(其中最后一个图标是一个包含 ...; 的变量)
      • @elado:苗条的文档不是说完全相反:github.com/slim-template/slim#output-without-html-escaping- 吗?
      • == 不会逃脱,= 会。您可以使用 tag attr=variable 呈现转义变量。如果您不想逃避它,请使用tag attr==variable。例如,要将 html 实体正确呈现为属性,您不应对其进行转义: ruby​​: icon = "&amp;#123;" slim: span.icon data-icon==icon
      • 我不赞成对我的回答进行编辑。额外的支架和管道确实增加了太多的噪音,而且收益不大。我故意选择了我的代码。我可以撤消编辑吗?
      【解决方案4】:

      下面还有另一种解决方法,以防它对任何人有所帮助。如果您有更复杂的代码要包含在链接中,则使用块特别有用。

      li
        = link_to current_user do
          i.icon-user>
          | My Profile
      

      【讨论】:

        【解决方案5】:

        如果您愿意,您可以使用精简语法而不是“原始”html 来执行类似的技术:

        li = link_to Slim::Template.new{ "i.icon-user\n| My Profile" }.render.html_safe, current_user
        

        呈现为:

      • My Profile
      • 或原始:

        <li>
          <a href="/current_user_url">
            <i class="icon-user"></i>
            My Profile
          </a>
        </li>
        

        在上面的示例中,要按照问题中的要求呈现“我的个人资料”文本,您需要使用",它允许使用\n 或换行来形成正确的苗条语法。 \t 会为您提供嵌套苗条所需的选项卡。

        如果可以在图标元素内呈现文本,则以下方法可行:

        li = link_to Slim::Template.new{ 'i.icon-user My Profile' }.render.html_safe, current_user
        

      • My Profile
      • <li>
          <a href="/current_user_url">
            <i class="icon-user">My Profile</i>
          </a>
        </li>
        

        如果将行为放在您自己的辅助方法中:

        # ApplicationController.rb
        
        def string_to_slim(string)
          Slim::Template.new{ string }.render.html_safe
        end
        helper_method :string_to_slim # allows you to call the method in a view via ERB or Slim
        

        然后您可以在视图.slim 由继承自您的基本控制器的控制器呈现:

        li = link_to string_to_slim('i.icon-user My Profile'), current_user
        

        【讨论】:

          猜你喜欢
          • 2016-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-04
          相关资源
          最近更新 更多