Динамическая сборка переменной JSON из HTML5 mobile send для контроллера Ruby on Rails

Клиент: HTML5 + JS + localdb Сервер: Rails3

Я пытаюсь закодировать небольшое мобильное приложение: приложение, которое представляет собой небольшую форму, которая записывает некоторую информацию о контактах в локальную базу данных. Затем при нажатии на кнопку "Синхронизация" он отправляет контакты в приложение RoR.

Пытаясь следовать рекомендациям, я хотел бы сохранить данные в формате JSON перед отправкой в ​​приложение RoR. Переменная JSON строится динамически из localdb:

на стороне клиента:

var myJSON= { 
            jcontacts:[]
        }; 

...
// loop on localdb
for (var i=0; i< vContacts.length;i++)
{                               
    myJSON.jcontacts.push({
        "name"      : vContacts[i][0],
        "email"     : vContacts[i][1],
        "info"      : vContacts[i][2]
    });                                                                                     
}           
var myJSONText = JSON.stringify(myJSON);    //(1) convert array to JSON string                                              

/*
console.log(myJSONText) --> {"jcontacts":[{"name":"John","email":"john@email.com","info":"Owner"},
{"name":"Mary","email":"mary@gmail.com","info":"Doctor"},
{"name":"Gary","email":"gary@email.com","info":"Driver"}]}
*/

var myObject = JSON.parse(myJSONText);// (2) convert JSON string to JSON object, just do it to make sure my var is valid JSON format
myGlobalJSONText = JSON.stringify(myObject); // (3) convert JSON object to JSON string before sending to server

/*
console.log(myGlobalJSONText) --> {"jcontacts":[{"name":"John","email":"john@email.com","insurance":"Medical"},
{"name":"Mary","email":"mary@gmail.com","insurance":"Medical"},
{"name":"Gary","email":"gary@email.com","insurance":"Car"}]}
*/
...
// Ajax
   $.ajax({
        type: "POST",                    
        url : "http://localhost:3000/contacts/multinew",
        cache: false,
        data: myGlobalJSONText,
        success: onSuccess,
        error: onError
    });

На стороне Rails:

def multinew        
    @vcontacts = JSON.parse(params[:jcontacts])     
    @vcontacts.each {|x| Contact.create(x)}   

    respond_to do |format|
        format.html { redirect_to(@contact)}
      format.xml  { head :ok }
    end
 end

При отправке данных мой сервер Rails отвечает:

Started POST "/contacts/multinew" for 127.0.0.1 at 2011-04-25 20:49:23 +0700
  Processing by ContactsController#multinew as */*
  Parameters: {"{\"jcontacts\":"=>{"{\"name\":\"John\",\"email\":\"john@email.com\",\"info\":\"Owner\"},{\"name\":\"Mary\",\"email\":\"mary@gmail.com\",\"info\":\"Doctor\"},{\"name\":\"Gary\",\"email\":\"gary@email.com\",\"info\":\"Driver\"}"=>{"}"=>nil}}}
Completed   in 0ms

TypeError (can't convert nil into String):

Итак, мои вопросы:

1) прежде чем пытаться исправить часть Rails, я хотел бы знать, все ли правильно в клиентском JavaScript-коде? Я предполагаю, что использование JSON заключается в том, что если переменная правильно сформирована на стороне клиента (с использованием JSON.stringify), ее следует правильно интерпретировать на стороне сервера (с использованием JSON.parse), это причина, по которой люди используют JSON?

2) если сторона кода клиента правильная, это означает, что я должен исправить код ruby, добавив некоторую обработку регулярных выражений? В этом случае я не вижу преимущества использования JSON (другие из соображений безопасности)

Большое спасибо!

1 ответ

Решение

Я наконец пришел с этим решением:

1 / На стороне клиента я отправляю объект JSON, а не строковую переменную JSON

2/ На стороне сервера я сделал небольшое исправление для преобразования полученной переменной has_array в простой массив

ЛЮБОЕ ЛУЧШЕЕ ПРЕДЛОЖЕНИЕ ДОБРО ПОЖАЛОВАТЬ!

Клиент:

{                               
    myJSON.jcontacts.push({
        "name"      : vContacts[i][0],
        "email"     : vContacts[i][1],
        "info"          : vContacts[i][2]
    });                                                                                     
}                                                                   

myJSONText = JSON.stringify(myJSON);    // array to JSON string , I cannot avoid this step before calling the PARSE method hereafter                                                                        
myGlobalJSONText = JSON.parse(myJSONText); // JSON string to JSON object    

Сервер: переменная получена как hash_array элементов has_array

{"0"=>{"name"=>"John", "email"=>"john@email.com", "info"=>"Doctor"},
"1"=>{"name"=>"Mary", "email"=>"mary@gmail.com", "info"=>"Driver"},
"2"=>{"name"=>"Gary", "email"=>"gary@email.com", "info"=>"Owner"}}

но мы должны преобразовать его в массив элементов has_array:

[{"name"=>"John", "email"=>"john@email.com", "info"=>"Doctor"},
 {"name"=>"Mary", "email"=>"mary@gmail.com", "info"=>"Driver"},
{"name"=>"Gary", "email"=>"gary@email.com", "info"=>"Owner"}]

Для этого:

def multinew            

@hash_contacts = params[:jcontacts]         
@array_contacts = Array.new
@hash_contacts.each_value {|value| @array_contacts<<value }

@array_contacts.each {|x| Contact.create(x)}   

...
Другие вопросы по тегам