在Rails 5中,将form_with的本地化设置为默认值为true

22

我正在开发一个项目,我们不会使用ajax调用来提交表单,因此我需要在项目中的每个表单中添加local: true,如Rails 文档所示:

:local - 默认情况下,表单提交是远程和无障碍的XHR。 使用local:true禁用远程提交。

有没有办法默认将本地选项设置为true?

我们正在像这样使用Rails 5 form_with助手:

<%= form_with(model: @user, local: true) do |f| %>
    <div>
        <%= f.label :name %>
        <%= f.text_field :name %>
    </div>

    <div>
        <%= f.label :email %>
        <%= f.email_field :email %>
    </div>
    <%= f.submit %>
<% end %>

你解决了这个问题吗? - cmrichards
不是的。必须将 local: true 设置到每个表单。 - Ramses
3个回答

29

如您所述,可以使用local: true在每个表单上设置。但是,可以使用配置选项[form_with_generates_remote_forms][1]来全局设置它。此设置确定form_with是否生成远程表单。默认为true。

这个配置应该放在哪里?Rails提供了四个标准位置来放置此类配置。但是您可能希望将此配置设置为所有环境(即开发、生产等)。因此,要么将其设置为初始化程序:

# config/initializers/action_view.rb
Rails.application.config.action_view.form_with_generates_remote_forms = false

或者更常见的是在 config/application.rb 文件中设置。

# config/application.rb
module App
  class Application < Rails::Application
    # [...]

    config.action_view.form_with_generates_remote_forms = false
  end
end

5
为了后人记录:这是比我之前建议的解决方案(https://dev59.com/wVYN5IYBdhLWcg3wNFp4#49492613)更好的解决方案。 - ekampp
根据ecoologic的回答,更新了更多关于配置文件放置位置的信息。 - Guy C

12

考虑重写form_with方法:

# form_helper.rb
def form_with(options)
  options[:local] = true
  super options
end

那应该可以解决您应用程序中的每个表单。


12
Rails 的配置可以在 config/application.rb 文件中进行设置。
module App
  class Application < Rails::Application
    # [...]

    config.action_view.form_with_generates_remote_forms = false
  end
end

Guy C 的回答很好,但把所有的配置放在这个文件中而不是单独的初始化器中更符合惯用语法;这是大多数 Rails 开发者所期望的地方。

请注意,如果您只将其放在 config/development.rb 或其他特定环境的文件中,那么情况可能会很糟糕。


1
这应该是被接受的答案。在大多数开发人员期望的位置更改配置,加1。 - Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接