2013-08-13 24 views
7

Mam następujący lalkowy przykładowy szablon:lalek szablon usunąć ostatni przecinek

{ 
    "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 
    } ], 
} 

stosowania go z rynku = [ 'UK', 'FR', 'IT'], pojawia się następujący:

{ 
    "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 
    } ], 
} 

Problem jest ostatnim przecinkiem, który powoduje, że jest to niepoprawna konfiguracja Solr.

Zamiast stosować markets.each zrobić, mógłbym użyć market.map i join (","). , ale jak korzystać z mapy w tym przypadku?

mogę używać mapę następująco:

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

byłoby wydrukować hello_UK,hello_FR,hello_IT (zauważ, że nie mamy przecinek po hello_IT), ale muszę coś takiego:

{ 
    "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 
    } ], 
} 

to nie działa.

, więc jak to działa? lub jak zmodyfikować mój szablon lalek, aby usunąć ostatni przecinek?

+0

Stara sztuczka polega na dodaniu do listy wpisu ze ślepym manekinem, który niczego nie niszczy. Może to opcja. – Thilo

+0

Użyłbym [jbuilder] (https://github.com/rails/jbuilder) – Stefan

+1

@Stefan, w jaki sposób podłączasz jbuilder do szablonu lalkowego? –

Odpowiedz

17

To jest właściwie problem z Rubinem. Ponieważ jest to tablica, po prostu zmień .each na .each_with_index. Następnie możesz zawrzeć ostatni przecinek w teście, aby sprawdzić, czy aktualna wartość indeksu jest o jeden mniejsza niż rozmiar indeksu. Więc

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

a następnie

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

dobre obejście na chwilę, dzięki. –

+0

Nie jestem pewien, dlaczego nazywasz to obejściem; to jest rozwiązanie. Puppet używa systemu szablonowego ERB (Embedded Ruby), a Ruby jest kodem używanym do manipulowania szablonami. Wszystko, co robi Puppet, to ustawia zakres zmiennej i zapewnia kilka funkcji pomocniczych. Nie może ci pomóc z iteracją przez tablicę - to coś, co musisz rozwiązać w kodzie Ruby. Cieszę się, że pomogłem w każdy sposób, ofc. – itsbruce

+1

to działa i rozwiązuje problem, i jestem bardzo wdzięczny za udostępnienie go. jednak zgodzisz się ze mną, że to brzydki kod. być może jest to jedyny rodzaj dostępnego rozwiązania, w tym przypadku oznacza to, że erb jest dość słaby (w porównaniu do Scala i szablonu playframework, na przykład). a może jest sposób na zrobienie tego bez tej sztuczki, może używając @ markets.map {| market | ...} .join (","), ale nie dowiedziałem się, jak to zrobić. –