2013-01-02 16 views
5

Mam problem z odstępem w znakach wielowierszowych.Biała spacja z ciągiem wielowierszowym w kolorze ruby ​​

Mam coś podobnego do tego w moim kodzie, gdzie generuję niektóre SQL.

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

Ale wtedy moje wcięcie SQL jest popsute, czego tak naprawdę nie chcę.

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

mogłem zrobić

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

które wyjścia dokładnie to, co chcę

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

Ale wtedy mój kod Wcięcia jest wszystko pomieszane, co ja tak naprawdę nie chce.

Jakieś sugestie, jak najlepiej osiągnąć to, co chcę?

+1

Martwisz się o piękno SQL, które wysyłasz do DBM, a to nie będzie prezentowane użytkownikom? * COUGH * * COUGH * [Bikeshedding] (http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality) * COUGH * –

+0

Nie powiedziałem, że nie będzie prezentowany użytkownikom – Marklar

Odpowiedz

2

Ruby 2.3.0 rozwiązuje ten ładnie z squiggly heredoc. Zwróć uwagę na różnicę tyldy/łącznika między przykładami.

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 

Z falowane heredoc, wcięcie najmniej wcięte linii zostanie usunięta z każdej linii zawartości.

7

Istnieją biblioteki jak ruby-dedent które pozwalają zrobić

require 'dedent' 

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

co skutkuje

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

Coś jak to powinno wystarczyć:

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

choć w tym przypadku, twój DB zignoruje białe spacje, więc może nie warto iść na kłopoty.

1

To zajmuje trochę więcej miejsca (i jest być może mniej ładna), ale działa dobrze:

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

daje

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