问题描述
使用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。