Увеличение букв с использованием .next

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 вызывает у меня ошибку.

Есть ли способ назначить что-то помимо 'A' на letter?

Ответ 1

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

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

Вам понравится следующее:)

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

Отметьте '@ABCD'.codepoints.to_a, чтобы увидеть волшебство.

Ответ 2

Ну технически, '@' является предшественником '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 в реальном коде.