如何使用JQuery将数据输出到Rails

时间:2009-05-25 20:10:20

标签: jquery ruby-on-rails ajax json

我正在尝试发送一个看起来像这样的jquery ajax PUT请求:

$.ajax({
          type: "PUT",
          url: '/admin/pages/1.json',
          data: { page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});

但是我收到以下错误:

The error occurred while evaluating nil.name
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:29:in `merge_element!'
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/xml_mini/rexml.rb:18:in `parse'
    (__DELEGATION__):2:in `__send__'
    (__DELEGATION__):2:in `parse'
    /Library/Ruby/Gems/1.8/gems/activesupport-2.3.2/lib/active_support/core_ext/hash/conversions.rb:154:in `from_xml' ... ...

就像Rails试图将params解析为XML,但我想使用JSON !!

如何将JSON放入rails?

6 个答案:

答案 0 :(得分:85)

所有浏览器都不支持PUT和DELETE,RubyOnRails支持使用名为 _method 的数据传递额外参数,这将指示RoR将如何处理请求。

$.ajax({
          type: "POST",
          url: '/admin/pages/1.json',
          data: { _method:'PUT', page : {...} },
          dataType: 'json',
          success: function(msg) {
            alert( "Data Saved: " + msg );
          }
});

答案 1 :(得分:36)

jQuery中的dataType参数不是您发送的,而是指定您希望回答的格式(是的,这是一个非常糟糕的名称)。如果您想以application/x-www-form-urlencoded之外的其他格式将数据发送到服务器,则应使用contentType参数。您还需要序列化data

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: JSON.stringify({...}),
      contentType: 'application/json', // format of request payload
      dataType: 'json', // format of the response
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});

答案 2 :(得分:5)

好吧,实际上我的JSON数据没有页面键,我的错误。这就是为什么它没有正确解析。但现在我得到“[object Object]”字符串作为页面键的值,而不是一个很好解析的json对象。

我应该在哪里看:JQuery还是Rails?

编辑:

我已经解决了我的问题,用以下脚本找到json对象:www.json.org/js.html:

$.ajax({
      type: "PUT",
      url: '/admin/pages/1.json',
      data: { page : JSON.stringify( {...} ) },
      dataType: 'json',
      success: function(msg) {
        alert( "Data Saved: " + msg );
      }
});

在铁轨一侧必须要求json gem。在控制器中:

 params[:page] = JSON.parse params[:page] if params[:page].is_a? String

答案 3 :(得分:1)

我有一个与jQuery / rails类似的问题[object Object],但是使用HTML而不是JSON。也许这会有所帮助 -

[object Object]

的参数
data: { lesson: { date: drop_date } }

lesson[date]

的参数
data: { "lesson[date]": drop_date }

希望这会有所帮助 -

答案 4 :(得分:1)

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_stop_watch);

    listView = (ListView) findViewById(R.id.listViewInStopWatch);
    timerList = new ArrayList<TimerState>();


    timerList.add(new TimerState());
    timerList.add(new TimerState());
    timerList.add(new TimerState());
    timerList.add(new TimerState());

    customAdapter = new CustomAdapterStopWatch(StopWatch.this, timerList);
    listView.setAdapter(customAdapter);

 }

答案 5 :(得分:0)

您可能只需要在jQuery上设置请求标头。

jQuery.ajaxSetup({ 
  'beforeSend': function(xhr) {
    xhr.setRequestHeader("Accept", "text/javascript");
  }
})