我有一个来自外部库的字符串,如下所示:
s = " things.each do |thing|\n thing += 5\n thing.save\n end\n\n"
此输入字符串不会更改。我需要使用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
请注意缩进。但是,我想要做的是将文本统一插入另外两个空格,如下所示:
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中缩进整个字符串,还是我运气不好?我想我可能会。
答案 0 :(得分: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, " ")
答案 1 :(得分:0)
这是一个更简单(但扩展性较差)的替代解决方案:
def indent(str, amount)
' ' * amount + str.split("\n").join("\n" + ' ' * amount)
end