3

我刚刚从 Rails 5.1 升级到 5.2。我对一个已经投入生产几个月没有问题的应用程序有很好的测试覆盖率。

我已经使用form_withRails 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复制这些配置值的文件。

4

2 回答 2

2

问题是我没有来自 Rails 5.1 的升级配置文件,这些文件会复制新的默认值。Rails 最终在 5.1(或 5.2?)中删除了它并使用 aconfig.load_defaults VERSION代替,它将所有升级的配置加载到指定的版本。

一次升级一个版本的危险之一是在我从 5.1 升级到 5.2 之间发生了变化!我建议提前阅读所有版本的所有发行说明,而不是一次只阅读一个。

于 2018-05-03T19:08:59.797 回答
0

从 Rails 5.1 升级到 Rails 5.2 后我遇到了同样的问题

ActionController::UnknownFormat request.formats: ["text/html"] 控件缺少此请求格式和变体的模板。

form_with submit 无法远程工作。它仅适用于 local: false 参数

config/application.rb以下是我文件中的相关行:

module RailsStarterKit
  class Application < Rails::Application
    config.load_defaults 5.2
于 2018-09-28T06:44:19.490 回答