13
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?

4

2 回答 2

28

那这个呢?

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

这行得通,但我会第二次@patrick-oscity:这是难以揭示其意图的晦涩代码。

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

检查'@ABCD'.codepoints.to_a它为什么起作用。

于 2013-03-21T17:26:36.120 回答
7

从技术上讲,'@'是 的前身'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 的方法。

于 2013-03-21T18:00:33.420 回答