我对format.js
和format.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
永远不会运行。
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_;格式";对于请求,订单是这样的。第一条规则将";获胜":
- 一个名为";"格式";,例如?format=json
- 接受标头
- 路径后缀,例如
/foo/bar.json
- 当XHR->总是js
- 否则为HTML
除了Accept
标头,您还可以在url:中显式声明格式
some_path/to/import_contacts_submit.js
some_path/to/import_contacts_submit.json