Ruby on Rails Asistencia控制器ParameterMissing错误求助
解决ActionController::ParameterMissing (param is missing or the value is empty: asistencia)
问题根源
从请求日志能看到,提交的参数是平级结构:
Parameters: {"authenticity_token"=>"[FILTERED]", "id"=>"1", "username"=>"Prueba", "entry"=>"false", "commit"=>"Registrar"}
但你的控制器要求参数嵌套在:asistencia键下(params.require(:asistencia)),两者不匹配导致报错。同时代码里还有几个逻辑错误:
@asistencia = User.all把实例变量赋值为用户集合,update动作需要单个用户实例而非集合- 表单使用集合模型,无法生成嵌套参数结构
- 手动输入
id和username存在安全风险,不符合Rails最佳实践
修复步骤
1. 修正控制器实例变量获取
替换原有的asistencia私有方法,改为获取单个用户实例(推荐用当前登录用户,避免手动输入ID):
class AsistenciaController < UsersController before_action :set_asistencia, only: [:update] def update if @asistencia.update(asistencia_params) redirect_to asistencia_path, notice: "Asistencia guardada correctamente" else render :edit, status: :unprocessable_entity end end private def set_asistencia # 如果是用户签到自己的记录,用current_user(需确保已实现登录逻辑) @asistencia = current_user # 如果必须通过ID查找,用下面的代码(不推荐,易被篡改) # @asistencia = User.find(params[:asistencia][:id]) end def asistencia_params params.require(:asistencia).permit(:entry) # 只允许修改entry字段 end end
2. 修正表单生成嵌套参数
修改form_with,添加scope: :asistencia让参数嵌套到:asistencia键下,同时移除不安全的id和username输入字段:
<h1>Marcar Asistencia</h1> <%= form_with model: @asistencia, scope: :asistencia, url: guardar_asistencia_path, method: :patch do |form| %> <%= form.label :entry, "Entrada o salida:" %> <%= form.select :entry, [["Entrada", true], ["Salida", false]] %> <%= form.submit 'Registrar' %> <%end%>
3. 配置路由(替代硬编码URL)
在config/routes.rb中添加命名路由,避免硬编码URL:
patch '/guardar_asistencia', to: 'asistencia#update', as: :guardar_asistencia
验证修复后的参数结构
修复后提交的参数会变成嵌套结构,符合控制器的要求:
Parameters: {"authenticity_token"=>"[FILTERED]", "asistencia"=>{"entry"=>"false"}, "commit"=>"Registrar"}
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

