javascript - 从 HTML5 移动设备动态构建 JSON 变量发送到 Ruby on Rails Controller

标签 javascript json ruby-on-rails-3 local-database

客户端: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 的优势(其他是安全原因)

非常感谢!

最佳答案

我终于找到了这个解决方案:

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

...

关于javascript - 从 HTML5 移动设备动态构建 JSON 变量发送到 Ruby on Rails Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5779198/

相关文章:

javascript - Leaflet清除geojson层(折线)

javascript - 使用 jQuery 处理 SharePoint 中多选选择字段的更改

arrays - 如何使用 json 对象数组创建外部配置单元表

c# - 附加到 Windows 应用程序中的 json 文件

ruby-on-rails - 使用 bundler 和 phusion 乘客部署 rails3 应用程序 : . bundle dir not found

authentication - Rails devise 当用户信息属于公司 devise

javascript - 谷歌地图显示多个位置的标记

json - 使用 jq 检查字符串是否是有效的 JSON

ruby - 使用 rspec 测试 after_create

javascript - 如何发送 SOAP 请求并使用 HTML 接收响应?