Rails form_tag提交后params[:commit]参数值为空问题排查
Rails表单提交后params[:commit]返回空字符串问题
问题描述
在Rails项目中点击表单提交按钮,预期params[:commit]返回值为'User',但对应controller动作中该参数值始终为空字符串"",相关代码及日志如下:
相关代码片段
Controller类代码
class AdminController < ApplicationController def show end def panel puts "Params ============================================= " if params[:commit] == 'Users' puts "Users ============================================= " puts params[:commit] elsif params[:commit] == 'Projects' puts "Projects ============================================= " puts params[:commit] else puts "ELSE ============================================" puts params[:commit] end end end
视图文件panel.html.erb代码
<%= form_tag url_for(action: 'panel'), method: "post" do %> <%= submit_tag 'User' %> <% end %>
路由配置(routes.rb)
Rails.application.routes.draw do root 'admin#show' get '/panel', to: "admin#panel" end
服务端运行日志
Processing by AdminController#panel as HTML Params ============================================= ELSE ============================================ Rendering layout layouts/application.html.erb Rendering admin/panel.html.erb within layouts/application Rendered admin/panel.html.erb within layouts/application (Duration: 0.9ms | Allocations: 523) Rendered layout layouts/application.html.erb (Duration: 6.5ms | Allocations: 2745) Completed 200 OK in 17ms (Views: 12.0ms | Allocations: 3047)
问题根因
- 路由配置缺失:表单指定使用
post方法提交,但路由文件中仅为/panel路径配置了get请求的映射,没有注册post路由。Rails遇到未匹配的请求方法时会自动重定向,将post请求转为get请求访问同路径,重定向过程中所有POST表单参数(包括提交按钮生成的commit参数)会被丢弃,最终controller拿到的params[:commit]为空。 - 代码逻辑笔误:视图中提交按钮的文本为
User,但controller里的判断条件写的是Users(末尾多了s),就算参数正常传递也无法进入对应判断分支。
修复方案
- 补全路由配置,为
/panel添加post请求映射,两种写法可任选其一:# 写法1:分别注册get和post路由 get '/panel', to: "admin#panel" post '/panel', to: "admin#panel" # 写法2:通过match一次性匹配两种请求方法 match '/panel', to: "admin#panel", via: [:get, :post] - 修正controller中的判断条件,将
params[:commit] == 'Users'改为params[:commit] == 'User',和提交按钮文本保持一致。 - 重启Rails服务使路由配置生效,再次提交表单即可正常获取
params[:commit]的值。
内容的提问来源于stack exchange,提问作者AkylbekSultanov77
相关产品推荐
相关产品推荐

