12 February 2009

использование JSON в Ruby on Rails, плюс пример var_dump на Javascript

Ruby on Rails
В этой статье я поведаю тебе %username%, как работать с JSON, а так же как вывести дамп любой переменной javascript для дебага.

Сначала немного теории. И так, основываясь на определение взятом с Wikipedia.
JSON — это текстовый формат обмена данными, основанный на JavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.

Так как лично я являюсь идолопоклонником языка Ruby и в частности фрэймворка Ruby on Rails, то пример серверной части буду описывать именно на нем. Хотя, принцип во всех языках одинаковый, я думаю любители других языков без проблем разберутся.

На серверной части пишем, что то вроде:
def MyController < ApplicationController
  def give_me_json
    data = Model.find(params[:id])
    # нужно, что бы тип контента был text/plain
    response.headers['Content-type'] = "text/plain; charset=utf-8"
    render :text => data.to_json
  end
end

На клиенте выполняем JavaScript (внимание, не забудьте подключить библиотеку prototype):
new Ajax.Request('/MyController/give_me_json', {
   asynchronous:true, evalScripts:true, 
   onComplete:function(request) {
       var x = eval('(' + request.responseText + ')'); 
       alert(var_dump(x));
   }, 
})

Или можно сделать на Ruby on Rails так:
<%= remote_function(:complete => "var x = eval('(' + request.responseText + ')'); alert(var_dump(x));", 
:url => { :action => 'give_me_json', :id => link.id }) %>

Для var_dump лучше конечно использовать не alert, а создать, например: <div id='debug_element'></div>, и выводить путем $('debug_element').innerHtml = var_dump(object);

Функций для вывода дампа информации о переменной на JavaScript великое множество. Я предпочитаю использовать функцию, которую подглядел здесь. Может, и не самый изящный вариант, но меня устраивает. Вот её код:
function var_dump(arr,level) {
  var dumped_text = "";
  if(!level) level = 0;

  //The padding given at the beginning of the line.
  var level_padding = "";
  for(var j=0;j<level+1;j++) level_padding += "    ";

  if(typeof(arr) == 'object') { //Array/Hashes/Objects
   for(var item in arr) {
    var value = arr[item];
   
    if(typeof(value) == 'object') { //If it is an array,
     dumped_text += level_padding + "'" + item + "' ...\n";
     dumped_text += var_dump(value,level+1);
    } else {
     dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
    }
   }
  } else { //Stings/Chars/Numbers etc.
   dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
  }
  return dumped_text;
} 

Вот и все. На последок, ИМХО, строка cгенерированная JSON-ом, на много компактнее и изящнее, чем делать контроллер для генерации динамического JavaScripta, как здесь. Или, упаси вас бог, отдавать через Ajax.Updater готовую страницу с уже расставленными HTML тэгами.
Tags: json var_dump javascript ruby ajax dump debug Ruby on Rails
Hubs: Ruby on Rails
-2
5.5k 9
Comments 9
Ads