Rails 5.1中如何为Bootstrap 4自定义表单验证设置novalidate?
在Rails中为form_tag添加novalidate属性以启用Bootstrap 4原生验证
我来帮你解决这个问题——其实你最后尝试的写法已经是正确的了,可能是测试时的缓存或者小疏漏导致没生效!
要生成你需要的<form class="needs-validation" novalidate>标记,只需要在form_tag的参数里传入novalidate: true即可:
<%= form_tag contact_path, class: "needs-validation", novalidate: true, method: 'get' do %> <div class="row"> <div class="form-group col-12 col-sm-12 col-md-4 col-lg-4 col-xl-4"> <%= label_tag "#{t :label_name}" %> <%= text_field_tag :name, params[:name], class: "form-control", minlength: 2, maxlength: 40, placeholder: "#{t :contact_placeholder_name}", required: true %> <div class="invalid-feedback"><%= "#{t :label_name} #{t :contact_error_required}" %></div> </div> <div class="form-group col-12 col-sm-12 col-md-4 col-lg-4 col-xl-4"> <%= label_tag "#{t :label_email_address}" %> <%= email_field_tag :email, params[:email], class: "form-control", minlength: 15, maxlength: 70, placeholder: "#{t :contact_placeholder_email}", required: true %> <div class="invalid-feedback"><%= "#{t :label_email_address} #{t :contact_error_required}" %></div> </div> <%= submit_tag "#{t :contact_submit}" %> </div> <% end %>
为什么之前的写法没生效?
我来逐个分析你尝试的几种写法的问题:
- 把novalidate放到class里:
class: "needs-validation novalidate"是错误的,因为novalidate是HTML属性,不是CSS类,浏览器不会把它当作禁用默认验证的指令。 - 单独写
:novalidate:这种在hash参数里单独放符号的写法,Rails会直接忽略,不会生成对应的属性。 novalidate: "novalidate":其实这个写法在HTML里是有效的(布尔属性只要存在就生效,不管值是什么),但Rails推荐用true来生成更标准的<form ... novalidate>格式,而不是带值的版本。novalidate: true:这是完全正确的写法!Rails的tag helper会把布尔值为true的属性转换为HTML5的布尔属性(只显示属性名,不显示值),正好生成你需要的标记。如果之前没生效,建议清空浏览器缓存或者重启Rails服务器试试。
另外要注意,Bootstrap 4的原生验证还需要确保:
- 表单控件有
required属性(你已经加了) - 对应的
invalid-feedback元素存在且结构正确(你的代码里也有) - 提交表单时,Bootstrap会自动触发验证并显示自定义提示,不需要额外的JS(除非你需要自定义验证逻辑)
内容的提问来源于stack exchange,提问作者Pamela Cook - LightBe Corp
相关产品推荐
相关产品推荐

