Rails 5.2.0 - scaffold`form_with`默认包含`local:true`

时间:2018-05-26 14:45:17

标签: forms ruby-on-rails-5

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

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

  

默认情况下,如果使用了诸如rails-ujs之类的Unobtrusive JavaScript驱动程序,form_with会附加通过XMLHTTPRequest在后台提交表单的data-remote属性。请参阅:local选项了解更多信息。

注意 - rails-ujs gem已在5.2.0 - https://github.com/rails/rails-ujs中移入Rails。所以看起来我不需要在gemfile中添加任何内容来启用默认的form_with行为。

疑难解答

我使用.railsrc和rails模板文件来自定义我的rails new脚手架。但是,我试过禁用&amp;删除这两个文件仍然可以从新的脚手架应用程序获得相同的结果。

2 个答案:

答案 0 :(得分:2)

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

在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 scaffold generator(rails g scaffold foo ...)。您应该看到您的更改反映在生成器创建的_form.html.erb文件中。

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

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

答案 1 :(得分:0)

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

5.2.0表单模板

local: true

所以我猜他们希望<%%= form_with(model: <%= model_resource_name %>, local: true) do |form| %> 作为支架的默认模板。可能为了简单起见?

查找脚手架生成器模板

感谢此帖有助于查找来源:Override Rails scaffold generator

  • 使用local: true命令
  • 查找您的宝石所在的位置
  • 我使用rbenv,因此我的gem enviornment
  • ~/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems到该文件中并查找cd
  • railties-5.2.0中搜索,或只搜索rails/generators/scaffold/templates
  • 这里是路径:local: true