Ruby 在ERB中缩进多行字符串

Ruby 在ERB中缩进多行字符串,ruby,string,erb,Ruby,String,Erb,我有一个来自外部库的字符串,如下所示: s = " things.each do |thing|\n thing += 5\n thing.save\n end\n\n" things.each do |thing| thing += 5 thing.run end 此输入字符串不会更改。我需要使用ERB将其插入到文件中。e、 g: erb = ERB.new("<%= s %>") File.write("test.txt", erb.r

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

s = "  things.each do |thing|\n    thing += 5\n    thing.save\n  end\n\n"
  things.each do |thing|
    thing += 5
    thing.run
  end
此输入字符串不会更改。我需要使用ERB将其插入到文件中。e、 g:

erb = ERB.new("<%= s %>")
File.write("test.txt", erb.result(instance_eval('binding'))
注意缩进。但是,我想做的是将文本均匀地缩进另外两个空格,如下所示:

    things.each do |thing|
      thing += 5
      thing.run
    end
如果我这样做:

erb = ERB.new("  <%= s %>")
我可以通过修改初始字符串来实现这一点

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

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

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

像这样的方法应该会奏效:

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, "  ")
classcodeindenter
这里有一个更简单(但可扩展性较差)的替代解决方案:

def缩进(str,金额)
''*amount+str.split(“\n”).join(“\n”+''*amount)
结束

您试过这个吗
ERB.new(“”
(前面是一个两个空格的字符串)。
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, "  ")