{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
但它不起作用。 如何获取数据并将其存储在数据库中。我是说如何将每个元素放入不同的列?
答案 0 :(得分:2)
最佳做法
首先,你应该在else语句中回应json,因为如果无法保存Table1,你将得到一个不合适的406(Not Acceptable)响应代码。 422(不可处理的实体)是合适的。
format.json { render :json => @user.errors, :status => :unprocessable_entity }
的解决方案强> 的
然后我认为错误在以下声明中
params[:table1]
1。如果您按照说明发送数据,则可以执行以下操作
@table1= Table1.new(:title => params[:title], :url => params[:url])
2。如果您想编写干净的代码,您应该以这种方式发送数据
table1: {
title: "Title of text",
url: "Url of text"
}
通过将数据包装在table1中,您无需进行任何更改。
答案 1 :(得分:1)
由于问题被问到很多时候,我想我的答案对作者没有帮助,但我希望我可以帮助其他有类似问题的人。
我基本上替换了这段代码:
@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?view=asciicast
此链接也可能有所帮助: Advanced Ajax with RoR and jQuery UI
答案 2 :(得分:0)
由于您将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])
此外,您最后可以添加一个故障安全条件,以避免NoMethodError
params[:table1]
不可用。
@table1= Table1.new(:title => params[:title], :url => params[:url])\
if params[:table1]
并进一步修改您的if条件
if @table1.save
到
if @table and @table1.save
希望这会有所帮助。 :)