【发布时间】:2021-03-15 02:05:24
【问题描述】:
问题总结
根据the docs,在使用form_with时,Rails默认发出Ajax请求。我需要一个 Ajax 请求,但我发现了一种情况,改为发出标准浏览器请求。我很想知道我做错了什么以及如何解决它。
期望行为:在提交表单时发出 Ajax 请求,因此我可以返回 JavaScript,它只会更改显示页面的一部分。
当前行为:标准浏览器请求发出 404 秒,因为该路由仅适用于 XHR。 (如果我让所有请求都可以访问该路由,则整个页面都会被替换,这仍然是非常不可取的。)
代码
这是生成表单的代码:
<%= form_with(url: restore_path,
method: 'post',
multipart: true,
id: 'restore-form') do %>
<label for="file">Backup file:</label>
<%= file_field_tag 'backup_file', required: true %>
<%= submit_tag('Restore',
id: 'restore-submit-button',
class: 'btn btn-primary',
data: { disable_with: 'Restoring...' }) %>
<% end %>
但是,这不会产生 Ajax 请求。 restore_path 是一条仅限 XHR 的路由...
constraints(->(req) { req.xhr? }) do
# other routes snipped for brevity's sake
post 'restore' => 'backups#restore'
end
...提交表单会导致 404,因为该请求是标准浏览器请求。
我在尝试调试时发现的一个奇怪现象
如果我将字段从 file_field_tag 更改为 text_field_tag,请求将作为 Ajax 提交。当我改变时
<%= file_field_tag 'file', required: true %>
到
<%= text_field_tag 'test_field', nil, required: true %>
其他一切都保持不变,一个 Ajax 请求按预期发出。生成的 HTML 的唯一变化(除了真实性令牌的确切值)是
<input type="file" name="file" id="file" required="required">
更改为
<input type="text" name="test_field" id="test_field" required="required">
...正如人们所期望的那样。但是表单提交行为完全改变了。
回购
项目是开源的;上述代码在https://github.com/steve-mcclellan/j-scorer/blob/master/app/views/stats/_options.html.erb
我尝试过的另一件事
我从头开始创建了一个小型的新 Rails 应用程序,以查看是否可以重现该问题,但我不能。即使存在文件上传,也会发出 Ajax 请求。
哈哈!
我的想法已经不多了。我究竟做错了什么?当文件字段存在时,如何让我的恢复表单发出 Ajax 请求?
【问题讨论】:
标签: jquery ruby-on-rails ajax forms