Rails.ajax数据未传递到控制器

问题描述

使用Rails 5.2.4,coffee-rails 4.2,jquery-rails 4.4.0,jquery-ui-rails 6.0.1

我有一些div,用户可以拖动它们并调整大小,此功能很漂亮。问题是完成对象移动后,我想基于百分比保存页面上新位置的值。我已经掌握了数学,一切都解决了。问题是通过我的咖啡脚本通过Rails.ajax调用提交数据。除了我定义的数据外,其他一切似乎都发送正常。这是我的位置:

<div class="selector ui-draggable ui-draggable-handle ui-resizable" style="position: absolute; width: 200px; height: 25px; top: 0; left: 0;" id="67745394-df31-4231-85b6-db0cff13c4ea" data-url="/documents/0a910275-5432-4c4e-a22d-dc1b4f70b958/versions/11095c90-087d-4723-ad9d-602f97b9954f/pages/82c4602b-0b7a-4238-a59f-f96bd5acb5df/form_fields/67745394-df31-4231-85b6-db0cff13c4ea">
   <div class="ui-resizable-handle ui-resizable-n" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-e" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-s" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-w" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-ne" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-nw" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se" style="z-index: 90;"></div>
   <div class="ui-resizable-handle ui-resizable-sw" style="z-index: 90;"></div>
</div>

这是我用来处理div的移动/调整大小的coffeescript,然后在每个事件的top事件之后调用该函数。

document.addEventListener 'turbolinks:load',->
  $('.selector').draggable()
  $('.selector').resizable handles: 'n,e,s,w,ne,nw,se,sw'

  $('.selector').on 'resizestop',(event,ui) ->
    sizing($(this))
    return
  $('.selector').on 'dragstop',ui) ->
    sizing($(this))
    return
  return

sizing = (div) ->
  oh = $('#form-layer').height()
  ow = $('#form-layer').width()
  height = (div.height() / oh * 100)
  width = (div.width() / ow * 100)
  left = (div.position().left / ow * 100)
  top = (div.position().top / oh * 100)
  Rails.ajax
    type: 'PATCH'
    dataType: 'script'
    accept: 'script'
    url: div.data('url')
    data:
      x: left
      y: top
      w: width
      h: height

问题是我没有将任何数据对象传递到控制器参数中,这些参数是这样传递的:

{"controller"=>"form_fields","action"=>"update","document_id"=>"0a910275-5432-4c4e-a22d-dc1b4f70b958","version_id"=>"11095c90-087d-4723-ad9d-602f97b9954f","page_id"=>"82c4602b-0b7a-4238-a59f-f96bd5acb5df","id"=>"67745394-df31-4231-85b6-db0cff13c4ea"}

我认为它与数据块的格式有关,但是我尝试了几种不同的尝试,但似乎找不到正确的方法来获取任何数据。如果通过以下内容,我会得到一些结果,但没有任何用处,打招呼之后输入的所有内容都不会通过。

...
    data:
      'hello'

我明白了

{"hello"=>nil,controller"=>"form_fields",...

解决方法

要发送一个请求主体,使Rails(从技术上说是Rack)可以理解您的需求,则需要使用Content-Type来对其进行解码:

  • application / x-www-form-urlencoded
  • multipart / form-data
  • application / json

机架只是不知道如何处理application/javascript,因此不会将请求正文解析为params哈希。

Rails.ajax
    type: 'PATCH'
    dataType: 'json'
    accept: 'script'
    url: div.data('url')
    data:
      x: left
      y: top
      w: width
      h: height

将Content-Type设置为application/json,将Accept设置为application/javascript会告诉服务器,您正在发送JSON,但您希望返回JavaScript。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...