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. docker :no such file or directory

    ---恢复内容开始--- 其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: ...

  2. python问答模块

    """ 该模块功能:获取用户的输入文本,通过输入文本和数据库中的关键主题文本相比较, 获取最佳的回答内容 """ import xlrd i ...

  3. php中 const 与define()的区别 ,选择

    来自: http://stackoverflow.com/questions/2447791/define-vs-const 相同点: 两者都可以定义常量 const FOO = 'BAR'; def ...

  4. yii2 controller发送json数据给前端

    最近要用yii2把之前老项目重构一下,因为前端打算用vuejs,所以Yii2前端那一套就放弃了,直接给前端传json数据 控制器代码: $response = Yii::$app->respon ...

  5. No module named pip.req

    https://stackoverflow.com/questions/25192794/no-module-named-pip-req#

  6. kubernetes实战(四):k8s持久化安装rabbitmq集群

    1.下载文件 https://github.com/dotbalo/k8s/ 2.创建namespace kubectl create namespace public-service 如果不使用pu ...

  7. 【Loadrunner】使用LR录制HTTPS协议的三种方法

    使用LR录制HTTPS协议的三种方法 一.最简单的方法:浏览器配置打开浏览器,安装证书,配置完成后直接用http协议录制即可(配置完成的标识就是打开网页,不显示安全提示) 二.LR配置修改操作步骤如下 ...

  8. (2.14)Mysql之SQL基础——游标

    (2.14)Mysql之SQL基础——游标 关键词:Mysql游标 -- (1)定义游标 declare cur_name cursor for select * from table_name wh ...

  9. mysql 数据操作 单表查询 where 约束 目录

    mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...

  10. Linux内核之vmlinux与vmlinuz

    因为是初次系统的学习Linux内核,过程中遇到了一些常常出现的名词.似曾相识,但对他们的含义又不是非常清楚.因此,将搜索到的内容进行一下汇总. 1.vmlinux   vmlinux是一个包括linu ...