✅问题:Rails.ajax的data不支持{}hash格式。必须使用string。 dataType的格式。
Rails.ajax({
url: url,
type: "PATCH",
data: {"post":{"category_id":this.value}},
dataType: "json"
})
不支持这个格式,不会传递参数。
$.ajax仍然可以使用。并可以用data: {"post":{"category_id":this.value}}传递参数。
解决记录:
昨天晚上2小时
成本:昨天一晚上2小时无解,参数就是不能上传,有点烦躁。
收获:chrome-inpector使用熟练度上升。
今天早上2小时
非时间成本:无。
收获:学习源码,理解Rail.ajax的过程。确认必须使用string格式上传data。
偶然发现解决了问题:
使用$.ajax的传统写法data: {"post":{"category_id":this.value}}, 成功后,看了一眼header的最下面有一个Form Data(1)
点击出现:
Form Data
摘录(点击查看Rails.ajax git)
if xhr.readyState is XMLHttpRequest.OPENED
xhr.send(options.data)
options.data必须是string格式
Rails.ajax部分是用xhttp语法写的。
因为Ajax,就是异步javascript和XML的组合。
两方面:
1. 浏览器内建XMLHttpRequest object ,用来从server上请求data.
2. Javascript 和 HTML DOM 显示这些数据。
⚠️:ajax是个误导的名字, 因为它常常使用plain text 或者JSON text来传输数据。

分析rails-ujs/utils/ajax.coffee中得代码:
AcceptHeaders是一个hash, 包括:text, html, xml, json, script等key/value对儿。
Rails.ajax = (options) ->
这是一个函数,options是参数,参数url, type, data, dataTpye等等。
options = prepareOptions(options)
调用prepareOptions()方法,返回得结果储存在变量options中。
prepareOptions = (options) ->
1.设置url,如果options参数中有url,直接用,否则使用当前网页窗口的URL
options.url = options.url or location.href
2. type是字符串,使用javascript中的 方法,变为大写字母。
options.type = options.type.toUpperCase()
# 如果type是"get" request,则把data参数附加到url后面
if options.type is 'GET' and options.data
# 如果不存在?则加上?然后附加data,否则加上&(目的是url中传参数)
if options.url.indexOf('?') < 0
options.url += '?' + options.data
else
options.url += '&' + options.data
# Use "*" as default dataType,如果有dataType参数,就使用它
options.dataType = '*' unless AcceptHeaders[options.dataType]?
options.accept = AcceptHeaders[options.dataType]
options.accept += ', */*; q=0.01' if options.dataType isnt '*'
options
xhr = createXHR options, -> #这是一个函数
createXHR = (options, done) -> #也是一个函数
createXHR = (options, done) ->
1. 新建请求。
xhr = new XMLHttpRequest()
# 打开并设置xhr, 类型,url,是否异步(是)
xhr.open(options.type, options.url, true)
#给请求头部增加一个label/value对儿,这是加一个代表header接受的数据格式。
xhr.setRequestHeader('Accept', options.accept)
# 当发送string时,设置 Content-Type
# Sending FormData will automatically set Content-Type to multipart/form-data
if typeof options.data is 'string'
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8')
如果不是options.crossDomain, 则设置。。。(安全原因,浏览器不支持crossDomain)
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest') unless options.crossDomain
# Add X-CSRF-Token(安全的原因,防止跨站虚伪请求攻击,增加token)
CSRFProtection(xhr)
xhr.withCredentials = !!options.withCredentials
# 当readyState变化则调用函数:根据XMLHttpRequest的状态, done是传入的参数
xhr.onreadystatechange = ->
done(xhr) if xhr.readyState is XMLHttpRequest.DONE
xhr
xhr = createXHR options, ->
# 调用processResponse方法,用来处理收到的response数据。
response = processResponse(xhr.response ? xhr.responseText, xhr.getResponseHeader('Content-Type'))
# 如果status是200则成功,否则报错。
if xhr.status // 100 == 2
options.success?(response, xhr.statusText, xhr)
else
options.error?(response, xhr.statusText, xhr)
options.complete?(xhr, xhr.statusText)
processResponse = (response, type) ->
# 如果反应的是string
if typeof response is 'string' and typeof type is 'string'
# 如果type字符串中有json, 则把response转化为普通格式。
if type.match(/\bjson\b/)
try response = JSON.parse(response)
# 如果是script格式的,则创建<script>并添加到head标签内。
else if type.match(/\b(?:java|ecma)script\b/)
script = document.createElement('script')
script.setAttribute('nonce', cspNonce())
script.text = response
document.head.appendChild(script).parentNode.removeChild(script)
# 如果是xml格式的,则对response转化为string.
else if type.match(/\bxml\b/)
parser = new DOMParser()
type = type.replace(/;.+/, '') # remove something like ';charset=utf-8'
try response = parser.parseFromString(response, type)
response
可以接受的dataType:
AcceptHeaders =
'*': '*/*'
text: 'text/plain'
html: 'text/html'
xml: 'application/xml, text/xml'
json: 'application/json, text/javascript'
script: 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript'
✅问题:Rails.ajax的data不支持{}hash格式。必须使用string。 dataType的格式。的更多相关文章
- 关于Jquery中ajax方法data参数用法的总结
data 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 processData 选项说明以禁止此自动转换.必须为 Key/Value 格式.如果为数组,jQ ...
- 解决ajax请求默认不支持重定向问题
1,Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面. 2,后台代码处理: @RequestMapping("/updateCurrentUser") public Str ...
- ✅问题:Rails.ajax自定义请求
chatroom.coffee中的js代码: document.addEventListener 'turbolinks:load', -> document.getElementById(&q ...
- 使用 fetch 代替 ajax(在不支持的浏览器上使用 XHR); This kind of functionality was previously achieved using XMLHttpRequest.
原生 JS Ajax,GET和POST 请求实例代码_javascript技巧_脚本之家 https://www.jb51.net/article/86157.htm 更新时间:2016年06月08日 ...
- Remodal – 支持 Hash 追踪的响应式模态窗口
Remodal 是一个扁平化,响应式,轻量而且容易定制的模态窗口插件,支持使用声明状态和 Hash 跟踪.您可以轻松地定义为模态弹窗定义背景景容器(如模糊效果).支持所有现代的浏览器. 您可能感兴趣的 ...
- JQuery.Ajax()的data参数类型
假如现在有这样一个表单,是添加元素用的. <form id='addForm' action='UserAdd.action' type='post'> <label for='un ...
- ajax的data传参的两种方式
ajax的data传参的两种方式 本文为转载. 1.[javascript] view plain copy /** * 订单取消 * @return {Boolean} 处理是否成功 */ func ...
- 关于$.ajax中data字段的整理--包括json转换和spring注解
1.前端$.ajax 的data为json提交的时候,后台方法中必须使用@RequestBody 注解 @RequestMapping(value = "getCpuData/{int ...
- ajax post data 获取不到数据,注意 content-type的设置
ajax post data 获取不到数据,注意 content-type的设置 .post/get关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的.好吧今天我也遇到了,网 ...
随机推荐
- docker :no such file or directory
---恢复内容开始--- 其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: ...
- python问答模块
""" 该模块功能:获取用户的输入文本,通过输入文本和数据库中的关键主题文本相比较, 获取最佳的回答内容 """ import xlrd i ...
- php中 const 与define()的区别 ,选择
来自: http://stackoverflow.com/questions/2447791/define-vs-const 相同点: 两者都可以定义常量 const FOO = 'BAR'; def ...
- yii2 controller发送json数据给前端
最近要用yii2把之前老项目重构一下,因为前端打算用vuejs,所以Yii2前端那一套就放弃了,直接给前端传json数据 控制器代码: $response = Yii::$app->respon ...
- No module named pip.req
https://stackoverflow.com/questions/25192794/no-module-named-pip-req#
- kubernetes实战(四):k8s持久化安装rabbitmq集群
1.下载文件 https://github.com/dotbalo/k8s/ 2.创建namespace kubectl create namespace public-service 如果不使用pu ...
- 【Loadrunner】使用LR录制HTTPS协议的三种方法
使用LR录制HTTPS协议的三种方法 一.最简单的方法:浏览器配置打开浏览器,安装证书,配置完成后直接用http协议录制即可(配置完成的标识就是打开网页,不显示安全提示) 二.LR配置修改操作步骤如下 ...
- (2.14)Mysql之SQL基础——游标
(2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...
- mysql 数据操作 单表查询 where 约束 目录
mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...
- Linux内核之vmlinux与vmlinuz
因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux vmlinux是一个包括linu ...