如何通过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
希望这可以帮助。 🙂
- rails link_to remote with params
- Rails,Backbone,PhoneGap,CORS(Access-Control-Allow-Origin错误不允许)
- 消失的检查标记之谜
- Rails AJAX – 获取下拉选项以填充表格
- 使用带远程的ajax的Ruby表单:true给出了ActionController :: InvalidAuthenticityToken错误。 经典提交没有
- Rails Auth Token和Ajax
- rails 4- 401未经授权的error handling
- 如何在Rails 4 App中启用CORS
- Ruby rails – jquery ajax提交表单