9

複数行の文字列に空白の問題があります。

SQLを生成しているコードには、これに似たものがあります。

def generate_sql
   <<-EOQ
      UPDATE page
         SET view_count = 10;
   EOQ
end

しかし、SQLのインデントがすべて台無しになり、実際には必要ありません。

"       UPDATE page\n          SET view_count = 10;\n"

私はそれをできた

    def generate_sql
<<-EOQ
UPDATE page
   SET view_count = 10;
EOQ
    end

どれが私が欲しいものを正確に出力するか

"UPDATE page\n   SET view_count = 10;\n" 

しかし、その後、私のコードのインデントはすべて台無しになります。これは私が本当に望んでいないことです。

私が求めていることを達成するための最善の方法について何か提案はありますか?

4

4 に答える 4

8

Ruby 2.3.0は、波状のヒアドキュメントを使用してこれをうまく解決します。例間のチルダ/ハイフンの違いに注意してください。

hyphen_heredoc = <<-MULTILINE_STRING
                    One line
                    Second line
                      Indented two spaces
                    MULTILINE_STRING

squiggly_heredoc = <<~MULTILINE_STRING_WITH_TILDE
                      One line
                      Second line
                        Indented two spaces
                      MULTILINE_STRING_WITH_TILDE

2.3.0 :001 > puts hyphen_heredoc
                      One line
                      Second line
                        Indented two spaces
2.3.0 :002 > puts squiggly_heredoc
One line
Second line
  Indented two spaces

波状のヒアドキュメントを使用すると、コンテンツの各行から最もインデントされていない行のインデントが削除されます。

于 2015-12-31T18:22:10.220 に答える
7

そのようなライブラリがありruby-dedentます

require 'dedent'

def generate_sql
   <<-EOQ.dedent
      UPDATE page
         SET view_count = 10;
   EOQ
end

その結果

"UPDATE page\n   SET view_count = 10;"
于 2013-01-02T18:31:20.640 に答える
2

これにはもう少しスペースが必要です(おそらくあまりきれいではありません)が、うまく機能します:

def generate_sql
   text = <<-EOQ
      UPDATE page
         SET view_count = 10;
   EOQ
   text.gsub(/^#{text.match(/^\s*/)[0]}/, '')
end

与える

"UPDATE page\n   SET view_count = 10;\n"
于 2013-01-02T18:44:25.400 に答える
1

このような何かがそれをするべきです:

def generate_sql
  <<-EOQ.gsub("\n", " ").strip
    UPDATE page
      SET ...
  EOQ
end

この場合、DBは空白を無視するため、問題を解決する価値はないかもしれません。

于 2013-01-02T18:31:38.907 に答える