Rails 5.2:对于AJAX请求,form_with需要“local:false”吗?

时间:2018-05-03 17:44:25

标签: ruby-on-rails ajax ruby-on-rails-5.2

我刚从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文件可以复制这些配置值。

2 个答案:

答案 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