Rails create按钮提交用户表单验证失败未返回原页的路由相关问题
解决方案
1. 确认强参数配置正确
检查你的Users控制器中是否实现了正确的m_user_params方法,允许所有必填字段传入:
private def m_user_params params.require(:m_user).permit(:first_name, :last_name, :email) end
如果缺少这段代码,所有表单参数都会被Rails默认过滤,@user的三个字段永远为空,验证会持续失败。
2. 修复路由配置冲突
你同时配置了大量自定义路由和单数resource :users,会导致路由匹配逻辑混乱,直接替换为如下配置即可:
# 删除之前所有手动声明的users相关路由,仅保留复数资源声明 resources :users
Rails会自动生成所有符合REST规范的路由,不需要手动逐个定义。
3. 修正表单代码
你的表单存在语法错误、字段缺失问题,修改后如下:
<%# 不需要手动写url,form_for会自动根据@user的状态匹配正确的提交路径 %> <%= form_for(@user) do |f| %> <%# 新增错误提示区,方便直观看到验证失败的原因 %> <% if @user.errors.any? %> <div class="alert alert-danger"> <ul> <% @user.errors.full_messages.each do |msg| %> <li><%= msg %></li> <% end %> </ul> </div> <% end %> <%= f.label :first_name, "first name", class: 'asterisk' %> <%= f.text_field :first_name, class: "form-control", placeholder: "first name" %> <%= f.label :last_name, "last name", class: 'asterisk' %> <%= f.text_field :last_name, class: "form-control", placeholder: "last name" %> <%# 补充缺失的email输入框,你的模型已验证email必填,表单必须包含该字段 %> <%= f.label :email, "邮箱", class: 'asterisk' %> <%= f.email_field :email, class: "form-control", placeholder: "请输入邮箱" %> <%= f.submit 'create user' , :class => 'btn btn-primary btn-md form_submit active' %> <% end %>
4. 简化控制器create方法(非强制,优化写法)
save方法内部会自动调用valid?,可以简化逻辑:
def create @user = MUser.new(m_user_params) if @user.save redirect_to users_path, notice: "user saved successfully." else flash.now[:alert] = 'please filled required information' render 'new' end end
修改完成后,未填必填字段提交表单时,会自动渲染回原表单页,同时显示对应的验证错误提示。
内容的提问来源于stack exchange,提问作者vvp45
相关产品推荐
相关产品推荐

