% curl "http://0.0.0.0:3000/photos/xml"‘to_xml’의 결과물은 포맷이 매우 잘 지켜져 있다. ‘photos’ 태그는 ‘photo’ 태그의 집합이고, 각각의 서브 태그는 다른 속성을 나타낸다. 완벽하다.... Megan after winning 2nd place in the pumpkin race. 1 37.591753 -122.048358 Megan At The Races http://0.0.0.0:3000/megan1.jpg
상단의 첫 두 줄은 매우 중요하다. "javascript_include_tag"는 페이지에 Prototype 라이브러리를 포함시킨다. 서버로부터 XML을 가져오기 위해 Prototype 라이브러리의 Ajax.Request를 사용할 것이다. 다음 script 태그는 map 객체들을 가져오는 구글 맵스 script 태그이다.Map Ajax Example <%= javascript_include_tag "prototype" %>
% curl "http://0.0.0.0:3000/photos/json" [{attributes: {latitude: "37.591753", title: "Megan At The Races", url: "http://0.0.0.0:3000/megan1.jpg", id: "1", description: "Megan after winning 2nd place in the pumpkin race.", longitude: "-122.048358"}}, ...매우 훌륭하다. 이제 앞의 예제에서 load 함수를 XML 대신 JSON을 사용하도록 고쳐보자. 그 고친 결과가 [리스트 7]에 있다.
function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); new Ajax.Request( "/photos/json", { method: "get", onSuccess: function( transport ) { var photos = eval( transport.responseText ); for( var b = 0; b < photos.length; b++ ) { if ( b == 0 ) map.setCenter(new GLatLng(photos[b].attributes.latitude, photos[b].attributes.longitude), 13); map.addOverlay( buildMarker( photos[b].attributes.title, photos[b].attributes.url, photos[b].attributes.description, photos[b].attributes.latitude, photos[b].attributes.longitude ) ); } } } ); } }좋다, 이게 훨씬 더 쉽다. 모든 XML 처리 부분 대신 단지 responseText를 "eval"하기만 하면 표시를 만들 때 쓸 사진 배열을 얻어올 수 있다.
% curl "http://0.0.0.0:3000/photos/jscallback" photos_callback([{attributes: {latitude: "37.591753", title: "Megan At The Races", ...이제 사진 핸들링 코드 대부분이 ‘photos_callback’이라는 새로운 함수 쪽으로 옮겨가기 때문에 우리의 ‘load’ 함수는 정말 작아질 것이다.
var map = null; function photos_callback( photos ) { for( var b = 0; b < photos.length; b++ ) { if ( b == 0 ) map.setCenter(new GLatLng( photos[b].attributes.latitude, photos[b].attributes.longitude ), 13); map.addOverlay( buildMarker( photos[b].attributes.title, photos[b].attributes.url, photos[b].attributes.description, photos[b].attributes.latitude, photos[b].attributes.longitude ) ); } } function load() { if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map")); new Ajax.Request( "/photos/jscallback", { method: "get", onSuccess: function( transport ) { eval( transport.responseText ); } } ); } }여기가 재미있는 부분이다. 우리가 Ajax.Request 메소드를 사용하길 원치 않았다면 어떻게 되었을까? 원하는 데이터가 다른 도메인에 있는 서버에 있어서 Ajax.Request를 사용할 수 없었다면 어떻게 됐을까? 자, 여기에 그 해결책이 있다.
이전 글 : 레일즈로 만드는 매쉬업하기 좋은 사이트(1)
다음 글 : 레일즈로 만드는 매쉬업하기 좋은 사이트(3)
최신 콘텐츠