我刚从Rails 5.1升级到5.2。我有一个应用程序的测试覆盖率很高,已经生产了几个月没有问题。
我在使用Rails 5.1时已经使用form_with
几个月了。 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
是默认,所以我不必手动指定它。
我在这里缺少什么?
请注意,与remote: true
的AJAX链接工作正常;它只是默认情况下不提交AJAX的表单。
更新
进行一些挖掘,看起来当我升级到5.1时可能会出现问题。我找不到config/initializers/new_framework_defaults_5_1.rb
文件,并且该文件将具有将form_with
设置为远程的默认标志。由于当我升级到5.2时该文件不存在,因此它没有将这些新的默认配置拉过来。如果我确认确实是问题,我会更新这个问题。
更新2
是的,确认问题是我没有config/new_framework_defaults_5_1.rb
文件可以复制这些配置值。
答案 0 :(得分:2)
问题是我没有Rails 5.1中的升级配置文件可以复制新的默认值。 Rails最终在5.1(或5.2?)中删除了它,并使用config.load_defaults VERSION
代替,它将所有升级的配置加载到指定的版本。
一次升级一个版本的危险之一,我从5.1升级到5.2之间的情况发生了变化!我建议提前阅读所有版本的所有发行说明,而不是一次只读一个。
答案 1 :(得分:0)
从Rails 5.1升级到Rails 5.2后,我遇到了同样的问题
ActionController :: UnknownFormat request.formats:[“ text / html”] Controlle缺少此请求格式和变体的模板。
form_with Submit不能在远程工作。它仅适用于local:false参数
以下是我的config/application.rb
文件中的相关行:
module RailsStarterKit
class Application < Rails::Application
config.load_defaults 5.2