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

时间:2012-01-10 21:52:54

标签: jquery ruby-on-rails ruby ajax json

{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

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

3 个答案:

答案 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

希望这会有所帮助。 :)