【问题标题】:Rails 5.2.0 - scaffold `form_with` includes `local: true` by defaultRails 5.2.0 - 脚手架 `form_with` 默认包含 `local: true`
【发布时间】:2018-11-05 17:18:18
【问题描述】:

当我为 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 %>

生成的 HTML

<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

如果使用不显眼的 JavaScript 驱动程序(如 rails-ujs),默认情况下 form_with 会附加 data-remote 属性,通过 XMLHTTPRequest 在后台提交表单。有关更多信息,请参阅 :local 选项。

注意 - rails-ujsgem 在 5.2.0 中被移入 Rails 本身 - https://github.com/rails/rails-ujs。所以看起来我不需要向 gemfile 添加任何东西来启用默认的form_with 行为。

疑难解答

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

【问题讨论】:

  • form_with 默认包含remote:true。如果您不想通过 JS 提出请求,可以添加 remote: false。此外,form_with 是处理表单的“新”rails 方式。
  • 感谢@Horacio 的帮助。但是这个问题是针对脚手架生成的表格,而不是手动生成的。我发现用于脚手架表单的模板在form_with 上明确使用了local: true 选项(见下文)。

标签: forms ruby-on-rails-5


【解决方案1】:

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

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

对于这个新文件的内容,一个好的起点是现有模板中的内容。您可以使用gem which rails 定位在当前环境中定义Rails 的文件(结果类似于/home/&lt;user&gt;/.rvm/gems/ruby-2.5.0@&lt;gemset&gt;/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

RailsGuides 提供有关自定义 Rails 生成器的详细信息。

【讨论】:

  • 不错!谢谢@Pathogen!很棒的步行。这就是我需要的。
【解决方案2】:

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

5.2.0 表单模板

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

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

查找脚手架生成器模板

感谢这篇帖子帮助寻找出处:Override Rails scaffold generator

  • 使用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

【讨论】:

  • 我建议不要破解您本地的 Rails gem 来自定义您的模板!这些更改不会签入源代码管理,协作者无法使用,并且如果您丢失或升级本地 gem,这些更改将消失。 Rails 有一个自定义脚手架模板的功能,请看一下:guides.rubyonrails.org/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多