2013-08-13 34 views
7

Tôi đã sau con rối ví dụ mẫu:rối mẫu loại bỏ các dấu phẩy cuối cùng

{ 
    "servers" : [ { 
    "port" : 9200, 
    "host" : "localhost", 

    "queries" : [ 
     <% @markets.each do |market| -%> 
     { 
     "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ], 
     "obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache", 
     "attr" : [ "hits","hitratio" ] 
    }, 
    <% end -%> 
    ], 
    "numQueryThreads" : 2 
    } ], 
} 

Áp dụng nó với thị trường = [ 'Anh', 'FR', 'IT'], tôi nhận được như sau:

{ 
    "servers" : [ { 
    "port" : 9200, 
    "host" : "localhost", 

    "queries" : [ 
      { 
     "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ], 
     "obj" : "solr/market_UK:type=queryResultCache,id=org.apache.solr.search.LRUCache", 
     "attr" : [ "hits","hitratio" ] 
    }, 
      { 
     "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ], 
     "obj" : "solr/market_FR:type=queryResultCache,id=org.apache.solr.search.LRUCache", 
     "attr" : [ "hits","hitratio" ] 
    }, 
      { 
     "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ], 
     "obj" : "solr/market_IT:type=queryResultCache,id=org.apache.solr.search.LRUCache", 
     "attr" : [ "hits","hitratio" ] 
    }, 
     ], 
    "numQueryThreads" : 2 
    } ], 
} 

Vấn đề là dấu phẩy cuối cùng, làm cho nó trở thành cấu hình solr không hợp lệ.

Thay vì áp dụng market.each, tôi có thể sử dụng market.map và join (','). nhưng cách sử dụng bản đồ trong trường hợp này?

tôi có thể sử dụng bản đồ như sau:

<%= @markets.map{ |market| "hello_"+market }.join(',') -%> 

này sẽ in hello_UK,hello_FR,hello_IT (lưu ý rằng chúng tôi không có một dấu phẩy sau hello_IT), nhưng tôi sẽ cần một cái gì đó như thế này:

{ 
    "servers" : [ { 
    "port" : 9200, 
    "host" : "localhost", 

    "queries" : [ 
     <% @markets.map |market| -%> 
     { 
     "outputWriters" : [ { "@class" : "com.googlecode.jmxtrans.model.output.StdOutWriter" } ], 
     "obj" : "solr/market_<%= market %>:type=queryResultCache,id=org.apache.solr.search.LRUCache", 
     "attr" : [ "hits","hitratio" ] 
    }, 
    <% }.join(',') -%> 
    ], 
    "numQueryThreads" : 2 
    } ], 
} 

tính năng này không hoạt động.

vậy, cách làm cho nó hoạt động? hoặc cách sửa đổi mẫu con rối của tôi để xóa dấu phẩy cuối cùng?

+0

Bí quyết cũ là bao gồm mục nhập giả cố định sau danh sách không phá vỡ bất kỳ thứ gì. Có lẽ đó là một lựa chọn. – Thilo

+0

Tôi muốn sử dụng [jbuilder] (https://github.com/rails/jbuilder) – Stefan

+1

@Stefan, làm cách nào bạn cắm jbuilder cho một mẫu con rối? –

Trả lời

17

Đây thực sự là vấn đề về Ruby. Vì đây là một mảng, chỉ cần thay đổi .each thành .each_with_index. Sau đó, bạn có thể bọc dấu phẩy cuối cùng trong một kiểm tra để xem liệu giá trị chỉ mục hiện tại có nhỏ hơn kích thước của chỉ mục hay không. Vì vậy,

<% @markets.each_with_index |market, i| -%> 

và sau đó

}<%= ',' if i < (@markets.size - 1) %> 
+0

giải pháp tốt cho thời điểm này, cảm ơn. –

+0

Tôi không chắc tại sao bạn gọi nó là giải pháp thay thế; đó là một giải pháp. Con rối sử dụng hệ thống tạo khuôn mẫu ERB (Embedded Ruby) và Ruby là mã bạn sử dụng để thao tác các mẫu. Tất cả các Puppet không được thiết lập phạm vi biến và cung cấp một vài chức năng trợ giúp. Nó không thể giúp bạn lặp lại thông qua một mảng - đó là điều bạn phải giải quyết trong mã Ruby. Vui mừng được giúp đỡ một trong hai cách, ofc. – itsbruce

+1

nó hoạt động và nó giải quyết vấn đề, và tôi rất biết ơn vì bạn đã chia sẻ nó. tuy nhiên, bạn sẽ đồng ý với tôi rằng đó là mã xấu. có lẽ đó là loại giải pháp duy nhất có sẵn, trong trường hợp này có nghĩa là erb khá nghèo (ví dụ như Scala và playframework template). hoặc có thể có một cách để làm điều đó mà không có thủ thuật này, có thể sử dụng thị trường @ market.map {| ...} .join (','), nhưng tôi không tìm ra cách. –

Các vấn đề liên quan