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

post[category_id]: 4 
我猜测应该使用"post[category_id]: 4 " 作为data的值,测试后,成功!
 
再回顾,发现了旁边还有一个view source , 和一个view url decode/encode。因为是string格式,所以编码解码都一样。而如果使用$.ajax的data: {"post":{"category_id":this.value}}, view source和view URL encode会进行编码:post%5Bcategory_id%5D=4
 
反思:这次走弯路也比较多,主要是知识块的欠缺和缺少实际经验。
 
最后:改成data: "post[category_id]="+ this.value

摘录(点击查看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的格式。的更多相关文章

  1. 关于Jquery中ajax方法data参数用法的总结

    data 发送到服务器的数据.将自动转换为请求字符串格式.GET 请求中将附加在 URL 后.查看 processData 选项说明以禁止此自动转换.必须为 Key/Value 格式.如果为数组,jQ ...

  2. 解决ajax请求默认不支持重定向问题

    1,Ajax默认是不支持重定向的,只局部刷新数据,不跳转页面. 2,后台代码处理: @RequestMapping("/updateCurrentUser") public Str ...

  3. ✅问题:Rails.ajax自定义请求

    chatroom.coffee中的js代码: document.addEventListener 'turbolinks:load', -> document.getElementById(&q ...

  4. 使用 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日 ...

  5. Remodal – 支持 Hash 追踪的响应式模态窗口

    Remodal 是一个扁平化,响应式,轻量而且容易定制的模态窗口插件,支持使用声明状态和 Hash 跟踪.您可以轻松地定义为模态弹窗定义背景景容器(如模糊效果).支持所有现代的浏览器. 您可能感兴趣的 ...

  6. JQuery.Ajax()的data参数类型

    假如现在有这样一个表单,是添加元素用的. <form id='addForm' action='UserAdd.action' type='post'> <label for='un ...

  7. ajax的data传参的两种方式

    ajax的data传参的两种方式 本文为转载. 1.[javascript] view plain copy /** * 订单取消 * @return {Boolean} 处理是否成功 */ func ...

  8. 关于$.ajax中data字段的整理--包括json转换和spring注解

    1.前端$.ajax 的data为json提交的时候,后台方法中必须使用@RequestBody 注解    @RequestMapping(value = "getCpuData/{int ...

  9. ajax post data 获取不到数据,注意 content-type的设置

    ajax post  data  获取不到数据,注意 content-type的设置 .post/get关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的.好吧今天我也遇到了,网 ...

随机推荐

  1. EasyUI +MVC +EF实现增删改查

    OA项目的框架已经搭建好了,接下来就是在这个框架下完成相应的业务的编码,接下来实现UserInfo页面的增删改查. 1.首先先谈一下遇到的一个框架上的问题:提示EF版本不一致之类的问题,主要是解决方案 ...

  2. Windows安装使用git

    下载安装Windows安装文档Git-2.16.2-64-bit双击安装(安装过程不详述) 打开git客户端 新建代码命令 mkdir /c/code 进入该目录(对应windows的c盘下面的目录) ...

  3. 牛客网多校赛第七场J--Sudoku Subrectangle

    链接:https://www.nowcoder.com/acm/contest/145/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  4. SQL Server的差异备份还原

    在SQL Server中还原差异备份,需要先还原在差异备份时间点之前的一个完整备份,在还原完整备份时要加上NORECOVERY参数,示例SQL语句如下: RESTORE DATABASE [数据库名称 ...

  5. UIWebView中加载的网页尺寸太大,如何让网页适应屏幕大小 WebView加载HTML图片大小自适应与文章自动换行

    webview.scalesPageToFit = YES; http://www.cnblogs.com/yujidewu/p/5740934.html 若需要根据图片原本大小,宽度小于320px的 ...

  6. 洛谷P2024 食物链 [NOI2001] 并查集

    正解:并查集 解题报告: 传送门(咕了! 其实没有很难(虽然我是交了三发才过的QAQ 但是一来好久没打并查集了恢复一下智力 二来看着智推里唯一一个蓝就很不爽(,,,虽然做了这题之后又补上了个蓝题QAQ ...

  7. postman app支持浏览器上的cookie

    1.  安装postman app 注意要安装postman application(一个应用软件),而不是chrome 插件,打开下面的这个开关 2. chrom浏览器 给chrom浏览器安装pos ...

  8. Java-idea-Checkstyle自动化代码规范检查

    一.概述 CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱 ...

  9. word安装mathtype

    1:window版本的mathtype:https://pan.baidu.com/s/1Yn8kPG9Y9nBPGaotFJaL2Q  ,密码spwm 2:点击exe安装   (安装到c盘,将不会出 ...

  10. hadoop2.x Federation

    单Active NN的架构使得HDFS在集群扩展性和性能上都有潜在的问题,当集群大到一定程度后,NN进程使用的内存可能会达到上百G,NN成为了性能的瓶颈 常用的估算公式为1G对应1百万个块,按缺省块大 ...