format.js和format.json在同一responsd_to中



我对format.jsformat.json如何协同工作有点困惑

我有一个ajax请求,这是控制器的操作:

def import_contacts_submit
@new_file = ContactsFile.new(contacts_file_params)
respond_to do |format|
@new_file.save
format.js
format.json { render json: @new_file.errors, status: :unprocessable_entity } if @new_file.has_errors?
end
end

实际上,似乎只有format.js在工作,因为我在ajax请求中的错误回调从未运行过。但是,如果我将format.json移动到format.js之上,那么ajax中的错误回调就会触发,format.js永远不会运行。

Rails通过读取http请求的Accept头来确定要采用的格式:

示例:

def test
f.js {
render js: "Hello World"
}
f.json {
render json: { foo: :bar }
}
end
curl localhost:3000/test -H 'Accept: application/json'
{"foo":"bar"}%
curl localhost:3000/test -H 'Accept: application/javascript'
Hello World%

尝试更改XHR调用中的标头accept,例如使用fetch:时

fetch(url, { 
headers: { 'Accept': 'application/json' },
})

类似于jquery的s.ajax或原始XHtmlRequest。

更新Rails内容协商:

Rails有一个确定格式的启发式方法。检查文档:https://api.rubyonrails.org/classes/ActionDispatch/Http/MimeNegotiation.html#method-i格式

CCD_;格式";对于请求,订单是这样的。第一条规则将";获胜":

  1. 一个名为";"格式";,例如?format=json
  2. 接受标头
  3. 路径后缀,例如/foo/bar.json
  4. 当XHR->总是js
  5. 否则为HTML

除了Accept标头,您还可以在url:中显式声明格式

some_path/to/import_contacts_submit.js
some_path/to/import_contacts_submit.json

相关内容

最新更新