Rails 5.2.0 - 脚手架"form_with"默认包含"local: true&



当我搭建 Rails 5.2.0 应用程序的脚手架时,我的脚手架表单总是使用form_with中包含的local: true选项生成。

rails g scaffold Article title:string

生成的脚手架形式

<%= form_with(model: article, local: true) do |form| %>
<% if article.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(article.errors.count, "error") %> prohibited this article from being saved:</h2>
<ul>
<% article.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>

生成的网页

<form action="/articles/1" accept-charset="UTF-8" method="post">

注意缺少data-remote属性

文档

我认为 Rails 5.1.2+ 中form_with的默认设置是使用具有data-remote属性的远程 AJAX/xhr 请求?换句话说,不包括local: true选项。

请参阅:http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-form_with

默认情况下,如果使用 Unobrisive JavaScript 驱动程序(如 rails-ujs(,form_with 会在后台附加通过 XMLHTTPRequest 提交表单的数据远程属性。有关详细信息,请参阅 :local 选项。

注意 -rails-ujsgem 在 5.2.0 - https://github.com/rails/rails-ujs 中被移到 Rails 本身中。因此,看起来我不需要向 gemfile 添加任何内容来启用默认的form_with行为。

故障 排除

我确实使用.railsrc和 rails 模板文件来自定义我的rails new脚手架。但是,我已经尝试禁用和删除这两个文件,并且仍然从新的脚手架应用程序中获得相同的结果。

为了根据我的评论给出更完整的答案,以下是添加模板以自定义使用脚手架生成器时由 Rails 部分生成的表单的方法。我在这里假设您使用的是 ERB,但如果您使用细导轨之类的东西来自定义视图生成器,则过程类似。

在 Rails 项目中创建一个文件:lib/templates/erb/scaffold/_form.html.erb.tt

对于此新文件的内容,一个不错的起点是现有模板中的内容。您可以使用gem which rails在当前环境中找到定义 Rails 的文件(结果为/home/<user>/.rvm/gems/ruby-2.5.0@<gemset>/gems/railties-5.2.0/lib/rails.rb(,然后从那里您可以在railties-5.2.0/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt中找到表单模板。将该文件的内容复制到新的生成器模板中。

尝试对新模板文件进行一些更改,然后运行 rails 脚手架生成器 (rails g scaffold foo ...(。您应该会看到您的更改反映在生成器创建的_form.html.erb文件中。

请记住,此模板是"双重嵌套"的 ERB,这意味着它第一次使用 ERB 进行处理以生成部分视图,然后在每次您的 Rails 应用程序向其提供请求时再次处理。也就是说,进行简单的更改通常不会太令人费解,例如从新模板中删除local: true

有关自定义 Rails 生成器的深入信息,请访问 RailsGuides。

我想我找到了答案 - 这很简单:) - 5.2.0 的 Rails 脚手架模板明确包含local: true选项。

5.2.0 表单模板

<%%= form_with(model: <%= model_resource_name %>, local: true) do |form| %>

所以我想他们希望local: true作为脚手架的默认模板。可能是为了简单?

查找脚手架生成器模板

感谢这篇文章帮助找到来源:覆盖轨道脚手架生成器

  • 使用gem enviornment命令查找宝石所在的位置
  • 我使用 rbenv,所以我的在~/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems
  • cd该文件并查找railties-5.2.0
  • rails/generators/scaffold/templates中搜索,或仅搜索local: true
  • 路径如下:~/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/railties-5.2.0/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt

最新更新