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

Nội dung thú vị. Vì vậy, điều này hoạt động. Nó quay vòng qua do loop và tăng thêm chữ cái. Vấn đề là, nó bắt đầu tại B. Tôi đã thử sử dụng chỉ letter trong hình, sau đó ở cuối bằng cách sử dụng letter.next! và thậm chí letter = letter.next, nhưng gmaps ném một lỗi cho tôi.Tăng các chữ cái bằng cách sử dụng .next

Có cách nào để gán thứ gì đó ngoài 'A' cho letter không?

Trả lời

21

Điều này thì sao?

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

Bạn sẽ thích cái này :)

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

Kiểm tra '@ABCD'.codepoints.to_a để xem sự kỳ diệu.

+1

oh người đàn ông bạn nhanh hơn tìm giải pháp 'rõ ràng' :) –

+1

'@' là vé !! – Dudo

6

Vâng về mặt kỹ thuật, '@' là tiền thân của 'A', vì giá trị ASCII của '@' là 64 và giá trị của 'A' là 65. Quan sát:

'A'.codepoints.first 
#=> 65 

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

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

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

trong ý nghĩa đó:

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

nhưng tôi mạnh mẽ không khuyến khích sử dụng ma thuật đen ™. Sử dụng một cái gì đó giống như cách tiếp cận của @ nicooga trong mã thực.

+1

'63.chr # =>"? " ', thông tin tốt đẹp. – shweta

Các vấn đề liên quan