2013-01-02 30 views
5

Tôi gặp vấn đề khoảng trắng với chuỗi nhiều dòng.Khoảng trắng với chuỗi nhiều dòng trong ruby ​​

Tôi có một cái gì đó tương tự như thế này trong mã của tôi, nơi tôi tạo ra một số SQL.

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

Nhưng sau đó sự can thiệp SQL của tôi là tất cả điều sai lầm, mà tôi không thực sự muốn.

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

tôi có thể làm

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

Những kết quả đầu ra chính xác những gì tôi muốn

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

Nhưng sau đó mã indention của tôi là tất cả những sai lầm, mà tôi không thực sự muốn.

Bất kỳ đề xuất nào về cách tốt nhất để đạt được những gì tôi theo sau?

+1

Bạn đang lo lắng về vẻ đẹp của SQL bạn đang gửi đến một DBM, và điều đó sẽ không được trình bày cho người dùng? * COUGH * * COUGH * [Bikeshedding] (http://en.wikipedia.org/wiki/Parkinson%27s_Law_of_Triviality) * COUGH * –

+0

Tôi không nói nó sẽ không được trình bày cho người dùng – Marklar

Trả lời

2

của Ruby 2.3.0 giải quyết này độc đáo với các squiggly heredoc. Lưu ý sự khác biệt của dấu ngã/dấu nối giữa các ví dụ.

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 

Với heredoc nguệch ngoạc, The thụt đầu dòng của kém thụt dòng sẽ bị xoá khỏi mỗi dòng của nội dung.

7

Có thư viện như ruby-dedent cho phép bạn làm

require 'dedent' 

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

mà kết quả trong

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

Something như thế này phải làm điều đó:

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

Mặc dù trong trường hợp này, DB của bạn sẽ bỏ qua khoảng trống, vì vậy nó có thể không đáng để gặp rắc rối.

1

này có một chút không gian hơn (và có lẽ là ít khá) nhưng hoạt động tốt:

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

cho

"UPDATE page\n SET view_count = 10;\n" 
Các vấn đề liên quan