首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Rails视图将ERB呈现为HTML和ERB

从Rails视图将ERB呈现为HTML和ERB
EN

Stack Overflow用户
提问于 2012-09-22 04:01:59
回答 2查看 1K关注 0票数 1

我正在制作一个样式指南,输出左边显示的右侧代码。

我知道添加%%会使再培训局

我编写了一个助手,它获取块的内容并在两个地方呈现代码,一个地方显示html,另一个地方显示创建html的源ERB。

问题是,我返回HTML,在那里我想要再培训局。

视图代码

代码语言:javascript
复制
<%= display_code do %>
  <%= link_to "Button", "/style_guide, class: "btn" %>
<% end %>

助手代码

代码语言:javascript
复制
module StyleGuideHelper
  def display_code(&block)
    content = with_output_buffer(&block)
    html = ""
    html << content_tag(:div, content, class: "rendered-code")
    html << content_tag(:div, escape_erb(content), class: "source-code-preview")
    html.html_safe
  end

  def escape_erb(code)
    code = code.gsub("%=", "%%=")
  end
end

预期结果 Button <%= link_to "Button","/style_guide,class: btn“%>

实际结果按钮

干杯

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-22 04:29:48

问题是,这个助手运行块(link_to "Button", ...) --它从未看到块中的源代码,只看到它的输出。您可以用escape_erb替换h来捕获生成的h,但这不会弹回生成它的ERB。

在我看来,你的选择是:

  1. 将示例分解为部分,然后创建一个助手,a)呈现部分文件,b)显示底层文件。
  2. 将您的ERB片段指定为字符串(遗传吗?),将字符串传递给助手,并让助手a)通过ERB.new(string).result(binding)对其进行计算,以呈现结果;b)显示字符串。
  3. 让助手确定视图的哪一部分调用它,然后很好地解析.erb以找到块。由于视图的编译方式,您在callers中所看到的精确格式可能会在没有通知的情况下更改。
  4. 创建一个助手,它使用疯狂的元编程juju在ERB上下文以及您自己的特殊上下文中计算块,该上下文拦截正在计算的代码并将其转换回标记。

...sorted按复杂性和成功率的近似顺序排列。

票数 0
EN

Stack Overflow用户

发布于 2015-04-14 14:53:16

下面的代码将允许您检索给定块的代码。

代码语言:javascript
复制
class ERBSource
  ERB = ::ActionView::Template::Handlers::ERB

  def self.for(block)
    new(block).source
  end

  attr_reader :block, :file, :line_number
  def initialize(block)
    @block = block
    @file, @line_number = *block.source_location
  end

  def source
    lines = File.readlines(file)

    relevant_lines = lines[(line_number - 1)..-1] || []

    extract_first_expression(relevant_lines)
  end

  private

  def extract_first_expression(lines)
    code = lines.slice[0,1].join # add the first two lines so it has to iterate less

    lines.each do |line|
      code << line
      return code if correct_syntax?(compile_erb(code))
    end
    raise SyntaxError, "unexpected $end"
  end

  def correct_syntax?(code)
    stderr = $stderr
    $stderr.reopen(IO::NULL)
    RubyVM::InstructionSequence.compile(code)
    $stderr.reopen(stderr)
    true
  rescue Exception
    $stderr.reopen(stderr)
    false
  end

  def compile_erb(code)
    ERB.erb_implementation.new(
      code,
      :escape => false,
      :trim => (ERB.erb_trim_mode == "-")
    ).src
  end
end

这就是帮手的样子

代码语言:javascript
复制
module StyleGuideHelper
  def render_example(name, &block)
    code = ERBSource.for(block)
    content_tag(:h2, name) +
      content_tag(:div, &block) +
      content_tag(:pre, content_tag(:code, code))
  end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12540572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档