2013-03-21 2 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 

Прохладный материал. Так что это работает. Он проходит через do loop и увеличивает букву. Проблема в том, что она начинается с B. Я попытался использовать только letter на картинке, затем в конце, используя letter.next!, и даже letter = letter.next, но gmaps вызывает у меня ошибку.Приращивание писем с использованием .next

Есть ли способ присвоить что-то помимо 'А' до letter?

ответ

21

Как насчет этого?

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

Вам нравится этот один :)

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

Проверьте '@ABCD'.codepoints.to_a, чтобы увидеть магию.

+1

ох вы быстрее находили «очевидное» решение :) –

+1

«@» - билет! – Dudo

6

Ну технически '@' является предшественником 'A', так как значение ASCII из '@' является 64, а значение 'A' составляет 65. Обратите внимание:

'A'.codepoints.first 
#=> 65 

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

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

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

в этом смысле:

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

но я решительно отвергаю использование черной магии ™. Используйте что-то вроде подхода @ nicooga в реальном коде.

+1

'63.chr # =>"? " ', хорошая информация. – shweta

Смежные вопросы