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'

これは機能しますが、2番目に@ patrick-oscityを使用します。これは、その意図をほとんど明らかにしないあいまいなコードです。

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

'@ABCD'.codepoints.to_aそれが機能する理由を確認してください。

于 2013-03-21T17:26:36.120 に答える
7

の ASCII 値は 64 で、 の値は 65であるため、技術的に'@'は の前身です。'A''@''A'

'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 に答える