【问题标题】:How to control text indentation when writing to file from custom generator从自定义生成器写入文件时如何控制文本缩进
【发布时间】:2021-07-29 08:11:25
【问题描述】:

编写我的第一个生成器。正在努力弄清楚如何控制缩进。

我找到了一些方法 herehere,但我并不清楚如何或是否可以应用这些方法。

生成器本身按预期工作,只是令人讨厌的是缩进很不稳定,我不得不忽略它或进入文件并修复它(这违背了自动生成文件内容的目的)。

不太确定哪些相关代码会有所帮助,这就是我生成附加代码的方式(一个基本示例)。

  def add_site_wide
    inject_into_file './app/controllers/application_controller.rb',
    after: "class ApplicationController < ActionController::Base\n" do <<-'RUBY'
      default_form_builder MdbFormBuilder
    RUBY
    end
  end

可能很容易看出发生了什么,唯一的问题是 default_form_builder MdbFormBuilder 的行缩进了很多,我可以移动它并且它确实被正确放置,但是生成它的文件看起来很不稳定并且内容越多越难以阅读。

有没有办法对这个或其他东西应用一种方法,让我也可以传递多少空格来缩进文本?

这确实看起来应该是可行的,但我找不到任何关于如何实现这一点的信息。

【问题讨论】:

  • 由于 HEREDOC 只是一个 String 构造函数,您可以将 indent 添加到 HEREDOC 的声明中,请参阅 String#indent 该示例准确包含如何将其与 HEREDOC 字符串一起使用。话虽如此,如果您查看 Rails 生成器 model 例如,它们看起来有点“古怪”,这就是为什么它们使用模板将其与代码构造分开的原因。
  • 您能否获取class ApplicationController &lt; ActionController::Base 的缩进并检查之前是否有另一行(可能是一个模块)并在此基础上添加正确数量的制表符/空格?

标签: ruby-on-rails generator


【解决方案1】:

使用&lt;&lt;- 将保留字符串上的空格。 你可以使用&lt;&lt;,但它要求你把字符串标记的结尾也没有任何缩进。

为了保持美观,String 类有一个方法可以满足您的需求,它是String#strip_heredoc。这将在每一行上缩进。

<<-EOS
i
 have
  indentation
EOS

将导致

"
i
 have
  indentation
"

使用

<<-EOS.strip_heredoc
i
 have
  no
   indentation
EOS

将导致

"
i
have
no
indentation
"

您可以使用@engineersmnky sugestion 来根据需要添加缩进

<<-EOS.strip_heredoc.indent(2)
i
 have
  two
   indentations
EOS

将导致

"
  i
  have
  two
  indentations
"

【讨论】:

  • 我知道它在某个地方,只是找不到它,感谢您的回答
猜你喜欢
  • 2014-11-18
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多