Динамическая сборка переменной JSON из HTML5 mobile send для контроллера Ruby on Rails - PullRequest
1 голос
/ 25 апреля 2011

Клиент: 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 Ответ

0 голосов
/ 26 апреля 2011

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

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)}   

...
...