2013-02-06 31 views
2

我想创建一个简单的部分,允许我显示代码块而不会通过我的代码中的奇怪的扭曲。完全逃脱多线erb段

所以我这样做的部分:

<% lang ||= "" %> 
<% language = "lang='#{lang}'" %> 

<div class="codebox"> 
     <% if title %> 
      <h3><%= title %></h3> 
     <% end %> 
    <pre <%= language %>><%=text.unindent%></pre> 
</div> 

这在lib中撤消缩进字符串(感谢一个非常漂亮的SO建议):

class String 
    def unindent; gsub(/^#{scan(/^\s+/).min}/, "") end 
end 

然后,我可以做到这一点,并得到一个非常漂亮的小盒子代码:

<%= render partial: 'pre', locals: { title: "example.html", lang: 'html', text: " 
       <div class='cl' style='text-align:center'> 
        <div class='collapse-group'> 
         <!-- Title, always viewable --> 
         <a class='bundle' href='#'>'Click here to expand'</a> 
        <div class='collapse'> 
         <!-- The content to be hidden or shown --> 
        </div> 
        </div> 
       </div> 
       "} %> 

这变成这样:

enter image description here

得好好的,除非我把一堆ERB的,在这种情况下,它会坚果和示数开始所有的地方。错误生产者的EX(。内容不是超级有关我确信内的所有报价都是双,而“串”是单引号):

<%= render partial: 'pre', locals: { title: "example.html", lang: 'html', text: ' 
       <% sub ||= "" %> 
       <% term ||= "(expand)" %> 
       <% style ||= "" %> 

       <div class="cl" style="text-align:center"> 
       <div class="collapse-group"> 
        <<%=tag%> class="squeeze" style=<%="#{style}"%>> 
         <%=title%> 
         <% if sub != "" %> 
          <small><%= sub %></small> 
         <% end %> 
         <a class="bundle" href="#"><%= term %></a> 
        </<%=tag%>> 
       <div class="collapse"> 
       ' } %> 

无论如何,我可以告诉HTML是什么,我把这些引号放在里面是100%文字字符?我已经尝试过单独转义“>”和“>”和“%”以及所有这些,并且我希望不会陷入混乱(无效)的路径。什么,我想上面看起来像

EX:

enter image description here

+1

为什么要在视图图层中设置所有文本?我不清楚你想逃脱什么,什么你不逃,或者为什么无论你想逃脱的是在模板中声明/初始化。 –

+0

好吧,这个想法是我会使用大量的代码框(有点像这样的代码框),我希望能够基本上粘贴我想格式化的代码并自动格式化,这就是我有上面第一个例子。它打破了ERB的例子。有没有更好的方法来做到这一点,我不知道?我绝对乐于接受建议。编辑 - 举了一个我想要完成以上任务的例子。 – Sasha

+0

如果文本值通常来自数据库,请勿尝试通过手动填写模板进行测试。 –

回答

1

我觉得这是一个很好的办法是在一个辅助(未测试,只是一个提示使用#capture,例如做什么):

def code_block(title = nil, lang = nil, &block) 
    output = capture(&block) # this is the answer to all your problems 
    output = output.unindent # optional, escape it as you want, too 
    # rendering a partial is still possible, 
    # but i'd recommend using an absolute path : 
    render partial: 'my_html_bits/code_block', 
     locals: {title: title, lang: lang, text: output } 
end 

那么你可以做:

<%= code_block('example.html', 'html') do %> 
    <%# whatever code here will be captured %> 
    <p>Even plain old html.</p> 
<% end %> 

作为一个方面说明:

  • #unindent方法或多或少模拟了上String现有的ActiveSupport猴子补丁,#strip_heredoc
  • 在这些情况下,使用#content_tag也可以为你节省很多的麻烦,即:

    <<%=tag%> class="squeeze" style=<%="#{style}"%>> 
    # more code... 
    

    将变成:

    <%= content_tag tag, class: 'squeeze', style: style do %> 
    # more code...