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)クライアントコード側が正しい場合は、正規表現処理を行ってルビーコードを修正する必要があることを意味しますか?この場合、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 に答える