この質問は、Ruby HEREDOC から先頭の空白文字を削除するにはどうすればよいですか?で部分的に回答されています。
Rails 3 には、#strip_heredoc
すべての空白を削除する というメソッドがあります。しかし、既に ID を持つ既存のファイルに行を挿入する場合、これはうまく機能しません。例:
begin
insert_into_file "#{app_name}/config/environments/production.rb", <<-DEVISE_MAILER_STUFF.strip_heredoc, :before => "end\n"
# for devise
config.action_mailer.default_url_options = { :protocol => 'https', :host => 'YOURHOSTNAME' }
config.action_mailer.delivery_method = :smtp
something.each do |x|
do stuff
end
DEVISE_MAILER_STUFF
end
「begin」と「end」は、ソース コードにインデントがあることを示すためにのみ追加されています。ヒアドキュメントには、「# for devise」の行の前に 4 つのスペースがあります。@strip_heredoc はこれらのスペースをすべて削除しますが、「do stuff」行の 2 つの余分なスペースは維持します。
これenvironments/production.rb
は次のようになります。
MyApp::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# *** Identation here is two spaces! (We are in a block.) ***
# for devise
config.action_mailer.default_url_options = { :protocol => 'https', :host => 'YOURHOSTNAME' }
config.action_mailer.delivery_method = :smtp
something.each do |x|
do stuff
end
# back to original identation of this file
end # MyApp::Application.configure block!
これを解決するには?ヒアドキュメントの代わりに他の方法があるのではないでしょうか? strip_heredoc(min)
最小限のスペースはどこにあるのだろうかと思っmin
たのですが、それはタブではうまく機能しないと思います。または、次のように、ヒアドキュメントの最初の行で左マージンを決定します。
puts <<-HEREDOC
FIRST_LINE
Real code here
HEREDOC
その「FIRST_LINE」はによって削除されstrip_heredoc
ますが、削除する必要があるスペース/空白の数も設定されます。したがって、出力には「Real code here」の前に 2 つのスペースが含まれます。
更新:おそらく次のようなもの:
String.class_eval do
def strip_heredoc_with_indent(indent=0)
new_indent = ( self.empty? ? 0 : ( scan(/^[ \t]*(?=\S)/).min.size - indent ) )
gsub(/^[ \t]{#{new_indent}}/, '')
end
end