gpt4 book ai didi

ruby-on-rails - 完全转义多行 erb 段

转载 作者:太空宇宙 更新时间:2023-11-03 16:31:46 28 4
gpt4 key购买 nike

我正在尝试创建一个简单的部分,它允许我显示代码块,而无需在我的代码中经历奇怪的扭曲。

所以我在部分中这样做了:

<% 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,在这种情况下它会发疯并开始到处出错。错误产生者的例子(内容不是 super 相关。我确保其中的所有引号都是双引号,而“字符串”是单引号):

<%= 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% 的文字字符?我已经尝试过单独转义“>”s 和“>”s 和“%”s 等等,但这是一条困惑(且无效)的路径,我希望不要走下去。

我希望上面的内容的 EX:

enter image description here

最佳答案

我认为一个不错的方法是使用 #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 monkey-patch,#strip_heredoc
  • 在这些情况下,使用 #content_tag还可以为您省去很多麻烦,即:

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

    可以变成:

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

关于ruby-on-rails - 完全转义多行 erb 段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14720724/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com