2012-01-10 4 views
0

{QUESTION MISE À JOUR}Comment envoyer et stocker des données sur des rails via jquery/ajax en tant qu'objet JSON?

Je souhaite envoyer des données au serveur sur lequel les rails sont installés. Mes données sont au format JSON telles que:

var JSONObject= { 
      table1: { 
         title: "Title of text", 
         url: "Url of text" 
         } 
        } 

et j'utiliser le code suivant dans cilent:

$.ajax({ 
      type: "POST", 
      url : "http://webadress.com/table1", 
      cache: false, 
      data: JSONObject, 
      statusCode: { 

       200:function() { alert("200"); }, 
       202:function() { alert("202"); } 
      }, 
      success: function() { alert("Data Send!");}, 
      error: function(xhr){ alert("The error code is: "+xhr.statusText);}   
     }); 

et dans le cilent, le code suivant existe:

def create 
    @table1= Table1.new(:title => params[:title], :url => params[:url]) 

respond_to do |format| 
    if @table1.save 
    format.html { redirect_to(@table1, :notice => 'User was successfully created.') } 
    format.xml { render :xml => @table1, :status => :created, :location => @table1} 
    format.json { render :json => @table1} 
    else 
    format.html { render :action => "new" } 
    format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
    format.json { render :json => @user.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

Mais ça ne marche pas. Comment puis-je obtenir des données et les stocker dans une base de données? Je veux dire comment puis-je mettre chaque élément dans différentes colonnes?

Répondre

2

Les meilleures pratiques

d'abord, vous devez répondre à JSON dans l'instruction else, parce que si Table1 ne peut pas vous être sauvé allez obtenir un code de réponse 406 (Non acceptable) qui ne convient pas. 422 (Entité non traitable) est approprié.

format.json { render :json => @user.errors, :status => :unprocessable_entity } 

Solution

Je pense que l'erreur est dans la déclaration suivante

params[:table1] 

1. Si vos données sont envoyées comme vous avez dit, vous pouvez faire quelque chose comme ça

@table1= Table1.new(:title => params[:title], :url => params[:url]) 

2. Et si vous voulez écrire un code propre, vous devez envoyer des données de cette façon

table1: { 
    title: "Title of text", 
    url: "Url of text" 
} 

En enveloppant vos données dans le tableau 1, vous aurez pas besoin de changer quoi que ce soit.

+0

Heureux d'entendre que cela fonctionne. Pourriez-vous valider la réponse? Merci – basgys

+0

Sory J'ai pensé que ça allait marcher mais ça ne fonctionne pas quel pourrait être le problème que j'ai fait tout ce que vous avez écrit. Mais ça ne dérange pas. mon code est situé dans https://github.com/ghaydarov/protonew/blob/master/app/controllers/pages_controller.rb – user1141820

+0

var JSONObject = { \t "page": { \t "title": « Titre du texte " \t "url": "Url du texte", \t "résumé": "AAAAA"}} \t \t \t \t .ajax $ ({type : "POST", url:" http: //proteomap.tranzsend.com/pages ", cache: false, contentType:" application/json; ", données: JSONObject, statusCode: { 200: function() {alert ("200"); }, 202: function() {alert ("202"); }}, succès: function() { alert ("Working"); }, erreur: fonction (xhr) { alert ("L'erreur est:" + xhr.statusText); } }); – user1141820

0

Étant donné que vous transmettez des données AJAX POST sous forme d'objet enveloppé sous la clé table1, vous devriez pouvoir lire l'objet dans l'action de votre contrôleur Rails en tant que params[:table1]. Vous pouvez modifier cette ligne:

@table1= Table1.new(:title => params[:title], :url => params[:url]) 

à

@table1= Table1.new(:title => params[:table1][:title]\ 
        , :url => params[:table1][:url]) 

En outre, vous pouvez ajouter une condition à sécurité à la fin pour éviter NoMethodError devrait params[:table1] être indisponible.

@table1= Table1.new(:title => params[:title], :url => params[:url])\ 
     if params[:table1] 

et plus modifier votre état si

if @table1.save 

à

if @table and @table1.save 

Hope this helps. :)

+0

Il donne une erreur et dit erreur interne du serveur ... – user1141820

+0

Pouvez-vous partager les exceptions que vous pourriez voir dans votre Rails journal d'application? Ce serait génial si vous pouviez le coller sur http://pastebin.com et partager le lien ici. – rhetonik

1

Comme il y avait beaucoup de temps depuis que la question a été posée, je suppose que ma réponse n'aidera pas l'auteur mais j'espère pouvoir aider d'autres personnes ayant des problèmes similaires.

Je essentiellement remplacé ce code:

@table1= Table1.new(:title => params[:title], :url => params[:url]) 

Avec celui-ci

@table1= Table1.new(params[:table1]) 

Utiliser Firefox avec Firebug (pour déboguer du côté client/javascript) avec cette RailCast (Pour debug RoR) m'a aidé pour déboguer et trouver une erreur dans mon code: http://railscasts.com/episodes/54-debugging-ruby-revised?view=asciicast

Ce lien peut aussi aider: Advanced Ajax with RoR and jQuery UI

Questions connexes