Devise表单提交按钮失效:与升级至v4.4.3是否有关联?
嘿,我之前也碰到过类似的Devise升级后表单异常的问题,结合你的情况,给你几个实用的排查和解决思路:
先确认表单结构完整性:你贴的代码里
form-co...明显是截断了,先检查f.email_field的class属性有没有正确闭合,更关键的是——提交按钮是不是放在form_for的代码块内部?Devise的表单必须把提交按钮包含在do |f| ... end这个范围内,不然按钮没法关联到表单的提交事件,自然点了没反应。核对Devise路由与API变化:升级到v4.4.3后,先在终端跑一下
rails routes,确认注册路径(registration_path(resource_name)对应的实际路由)是不是POST方法的/users(默认情况)。有时候版本升级可能会调整路由命名,要是路径不匹配,表单提交就会失败。排查JavaScript冲突或报错:打开浏览器开发者工具(按F12)切换到Console标签,看看有没有JS报错——比如Turbo(如果是Rails 7+项目)、jQuery这类工具的冲突,或者自定义的JS代码不小心阻止了表单的默认提交行为。另外也可以试试禁用页面的自定义JS,测试基础表单能不能提交。
验证Devise资源关联是否正常:你代码里用到了
devise_error_messages!,可以故意填个无效邮箱(比如不带@符号)提交,看看错误提示能不能正常显示。如果错误信息也不出来,那大概率是resource或者resource_name的传递出了问题,导致表单没和Devise的注册逻辑绑定上。用基础表单做对比测试:先把你自定义的class、布局都去掉,用最原始的Devise注册表单代码测试:
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <div> <%= f.label :email %><br /> <%= f.email_field :email, autofocus: true, autocomplete: "email" %> </div> <div> <%= f.label :password %> <% if @minimum_password_length %> <em>(<%= @minimum_password_length %> characters minimum)</em> <% end %><br /> <%= f.password_field :password, autocomplete: "new-password" %> </div> <div> <%= f.label :password_confirmation %><br /> <%= f.password_field :password_confirmation, autocomplete: "new-password" %> </div> <div><%= f.submit "Sign up" %></div> <% end %>
如果这个基础表单能正常提交,那问题就出在你自定义的HTML结构上——比如某个div标签没闭合,或者自定义的CSS/JS影响了表单的交互。
内容的提问来源于stack exchange,提问作者john seymour

