2

我有一个来自外部库的字符串,如下所示:

s = "  things.each do |thing|\n    thing += 5\n    thing.save\n  end\n\n"

这个输入字符串不会改变。我需要使用 ERB 将其插入到文件中。例如:

erb = ERB.new("<%= s %>")
File.write("test.txt", erb.result(instance_eval('binding'))

我的问题是缩进。在不对字符串进行任何更改的情况下,文件将像这样编写:

  things.each do |thing|
    thing += 5
    thing.run
  end

注意缩进。然而,我想要做的是插入文本统一缩进另外两个空格,如下所示:

    things.each do |thing|
      thing += 5
      thing.run
    end

如果我这样做:

erb = ERB.new("  <%= s %>")

然后只有第一行会缩进。

    things.each do |thing|
    thing += 5
    thing.run
  end

可以通过修改初始字符串来实现这一点..

erb = ERB.new("<%= s.gsub(/  (\w)/, "    \\1") %>")

..但这感觉有点乱。我真的不想在视图中这样做。有没有办法在 ERB 中缩进整个字符串,还是我不走运?我想我可能是。

4

2 回答 2

2

这是一个更简单(但扩展性较差)的替代解决方案:

def indent(str, amount)
  ' ' * amount + str.split("\n").join("\n" + ' ' * amount)
end
于 2019-03-07T20:06:48.867 回答
1

我认为您的问题没有任何内置解决方案。但这并不意味着您不应该只构建自己的 :)

像这样的东西应该工作:

class CodeIndenter < Struct.new(:code, :indentation)
  def self.indent(*args)
    self.new(*args).indent
  end

  def separator
    "\n"
  end

  def indent
    code.split(separator).map do |line|
      indentation + line
    end.join(separator)
  end
end

s = "  things.each do |thing|\n    thing += 5\n    thing.save\n  end\n\n"
puts CodeIndenter.indent(s, "  ")
于 2013-06-29T16:49:31.197 回答