我刚刚从 Rails 5.1 升级到 5.2。我对一个已经投入生产几个月没有问题的应用程序有很好的测试覆盖率。
我已经使用form_with
Rails 5.1 几个月了。默认情况下form_with
,所有表单默认都是 AJAX 并且必须指定local: true
才能有正常的 HTTP POST 请求。
在升级到 Rails 5.2 之后(我遵循了升级指南),我遇到了一些表单不再作为 AJAX 请求提交的情况,除非我特别添加local: false
它们。
滚动到代码片段的末尾以查看local: false
有效的附加功能。代码直接从应用程序中获取,无需更改。
# This will not work and submits a normal HTTP POST
<%= form_with model: @team_member_type, url: [:settings, @team_member_type], class: "dialog-container", id: "team_member_type-dialog", data: { closable: "false" } do |form| %>
# This will work and submits an AJAX request
<%= form_with model: @team_member_type, url: [:settings, @team_member_type], class: "dialog-container", id: "team_member_type-dialog", data: { closable: "false" }, local: true do |form| %>
当我提交没有声明的表格时local: false
,我得到:
Authenticated::Settings::TeamMemberTypesController#create is missing a template for this request format and variant. request.formats: ["text/html"] request.variant: []
同样,我所做的唯一更改是手动添加local: false
到表单以强制它远程。
文档说这local: false
是默认的,所以我不应该手动指定它。
我在这里想念什么?
请注意,AJAX 链接remote: true
工作得很好;只有默认情况下不提交 AJAX 的表单。
更新
做一些挖掘,当我升级到 5.1 时,它看起来可能是一个问题。我找不到该config/initializers/new_framework_defaults_5_1.rb
文件,并且将默认标志设置form_with
为远程。由于当我升级到 5.2 时该文件不存在,所以它没有拉出那些新的默认配置。如果我确认确实是问题所在,我会更新这个问题。
更新 2
是的,确认问题是我没有config/new_framework_defaults_5_1.rb
复制这些配置值的文件。