2013-03-21 11 views
10
def home 
    letter = 'A' 
    @markers = Location.all.to_gmaps4rails do |loc, marker| 
    marker.infowindow render_to_string(partial: '/locations/info', 
             locals: {object: loc}) 
    marker.picture({picture: "http://chart.apis.google.com/chart?chst=d_map_pin_letter&chld=#{letter.next!}|9966FF|000000", 
        width: 32, 
        height: 32, 
        shadow_picture: "http://chart.apis.google.com/chart?chst=d_map_pin_shadow", 
        shadow_width: 110, 
        shadow_height: 110, 
        shadow_anchor: [17,36]}) 
    marker.title "Title - #{loc.name}" 
    marker.sidebar render_to_string(partial: '/locations/sidebar', 
            locals: {object: loc}) 
    marker.json({id: loc.id}) 
    end 
end 

Cool stuff. Quindi questo funziona. Passa attraverso lo do loop e incrementa la lettera. Il problema è che inizia da B. Ho provato ad usare solo letter nell'immagine, quindi alla fine usando letter.next! e anche a letter = letter.next, ma gmaps mi ha lanciato un errore.Incrementare le lettere usando .next

C'è un modo per assegnare qualcosa oltre a "A" a letter?

risposta

21

Che dire di questo?

letters = ('A'..'Z').to_a 
letters.shift #=> 'A' 
letters.shift #=> 'B' 

Ti piace questa :)

letter = '@' 
letter.next! #=> "A" 

Controllare '@ABCD'.codepoints.to_a per vedere la magia.

+1

oh uomo sei stato più veloce a trovare la soluzione 'ovvia' :) –

+1

'@' è il biglietto !! – Dudo

6

Beh tecnicamente, '@' è il predecessore di 'A', perché il valore ASCII di '@' è 64 e il valore di 'A' è 65. Rispettare:

'A'.codepoints.first 
#=> 65 

'A'.codepoints.first - 1 
#=> 64 

('A'.codepoints.first - 1).chr 
#=> "@" 

('A'.codepoints.first - 1).chr.next 
#=> "A" 

in questo senso:

'@'.next == 'A' 
#=> true 

ma sconsiglio vivamente l'uso della magia nera ™. Usa qualcosa come l'approccio di @ nicooga nel codice reale.

+1

'63.chr # =>"? " ', bella informazione. – shweta