当我搭建 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-ujs
gem 在 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