1

客户端:HTML5 + JS + localdb 服务器:Rails3

我正在尝试编写小型移动应用程序:该应用程序是一种将一些联系人信息记录到本地数据库中的小型表单。然后,当单击“同步”按钮时,它会将联系人发送到 RoR 应用程序。

尝试遵循一些最佳实践,我想在将数据发送到 RoR 应用程序之前以 JSON 格式存储数据。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 的优势(其他安全原因)

非常感谢!

4

1 回答 1

0

我终于有了这个解决方案:

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    

服务器:变量作为has_array元素的hash_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)}   

...
于 2011-04-26T03:22:16.853 回答