如何通过jquery / ajax作为JSON对象将数据发送和存储到rails?

{QUESTION UPDATED}

我想将一些数据发送到安装了rails的服务器。 我的数据是JSON格式,例如:

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

我在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);} }); 

在cilent中,存在以下代码:

 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 

但它没有用。 如何获取数据并将其存储在数据库中。 我是说如何将每个元素放入不同的列?

最佳实践

首先,你应该在else语句中响应json,因为如果无法保存Table1,你将获得一个不合适的406(不可接受)响应代码。 422(不可处理的实体)是合适的。

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

然后我认为错误在以下声明中

 params[:table1] 

如果你的数据像你说的那样发送,你可以做这样的事情

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

如果你想编写干净的代码,你应该以这种方式发送数据

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

通过将数据包装在table1中,您无需进行任何更改。

由于问题被问到很多时候,我想我的答案对作者没有帮助,但我希望我可以帮助其他有类似问题的人。

我基本上替换了这段代码:

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

有了这个

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

使用Firefox和Firebug(调试客户端/ javascript)使用此RailCast(调试RoR)帮助我调试并在我的代码中找到错误: http ://railscasts.com/episodes/54-debugging-ruby-revised ?视图= asciicast

此链接也可能有所帮助: 使用RoR和jQuery UI进行高级Ajax

由于您将AJAX POST数据作为包装在键table1下的对象传递,因此您应该能够将Rails控制器操作中的对象读取为params[:table1] 。 你可以修改这一行:

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

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

此外,您可以在最后添加一个故障安全条件,以避免在params[:table1]不可用时出现NoMethodError

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

并进一步修改你的if条件

 if @table1.save 

 if @table and @table1.save 

希望这可以帮助。 🙂