【问题标题】:How to send and store data to rails through jquery/ajax as a JSON object?如何通过 jquery/ajax 将数据作为 JSON 对象发送和存储到 Rails?
【发布时间】:2012-01-10 21:52:53
【问题描述】:

{问题已更新}

我想向安装了 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

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

【问题讨论】:

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


    【解决方案1】:

    最佳实践

    首先您应该在 else 语句中响应 json,因为如果无法保存 Table1,您将得到一个不合适的 406(不可接受)响应代码。 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 中,您无需进行任何更改。

    【讨论】:

    • 很高兴听到它有效。你能验证答案吗?谢谢
    • 对不起,我以为它会起作用,但它不起作用可能是问题所在,我按照您所写的那样做了所有事情。但它不工作。我的代码位于github.com/ghaydarov/protonew/blob/master/app/controllers/…
    • var JSONObject= { "page": { "title": "Title of text", "url": "Url of text", "summary": "aaaaa"} } $.ajax( {类型:“POST”,url:“proteomap.tranzsend.com/pages”,缓存:false,contentType:“application/json;”,数据:JSONObject,statusCode:{200:function(){alert(“200”);}, 202:function() { alert("202"); } }, 成功: function(){ alert("Working"); }, error: function(xhr){ alert("错误是: "+xhr.statusText ); } });
    • 但是在下面的地址中只创建了一个空数据。 proteomap.tranzsend.com
    【解决方案2】:

    由于问这个问题已经很长时间了,我想我的回答对作者没有帮助,但我希望我能帮助其他有类似问题的人。

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

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

    有了这个

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

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

    此链接也可能有帮助: Advanced Ajax with RoR and jQuery UI

    【讨论】:

      【解决方案3】:

      由于您将 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])
      

      此外,您可以在最后添加一个故障安全条件,以避免 NoMethodErrorparams[:table1] 不可用时发生。

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

      并进一步修改您的 if 条件

      if @table1.save
      

      if @table and @table1.save
      

      希望这会有所帮助。 :)

      【讨论】:

      • 您能否分享您在 Rails 应用程序日志中可能看到的任何异常?如果您可以将其粘贴到 pastebin.com 并在此处分享链接,那就太好了。
      猜你喜欢
      • 2021-12-31
      • 2015-06-14
      • 1970-01-01
      • 2015-09-24
      • 2015-11-29
      • 1970-01-01
      • 2019-04-15
      • 2016-09-01
      • 2021-12-10
      相关资源
      最近更新 更多