Rails中link_to参数传递到控制器动作后无法存入数据库问题求助
问题原因及修复方案
- 路由参数顺序错位
你配置的路由规则为get '/reservas/:fecha/:id', to: 'reservas#cupoClase',参数顺序是fecha在前、id在后,但你在link_to里传参的顺序是id在前、fecha在后,路径匹配时两个参数会完全错位,你拿到的params[:id]实际是fecha的值,params[:fecha]实际是id的值。
修复方式:调整路由参数顺序,同时给路由加命名方便调用:
# routes.rb get '/reservas/:id/:fecha', to: 'reservas#cupoClase', as: 'cupo_clase_reserva'
视图里直接用命名路由生成链接,避免参数顺序问题:
<%= link_to 'Reservar', cupo_clase_reserva_path(id: clas.id, fecha: clas.fecha) %>
- 参数读取逻辑错误
你在cupoClase方法中调用@clase.reservas.new(params[:reserva]),但你从link_to传递的参数没有包裹在reserva这个层级的key下,params[:reserva]本身是空值。而且你已经手动赋值了所有需要的字段,完全可以直接初始化空对象即可:
# 替换原来的@reserva = @clase.reservas.new(params[:reserva]) @reserva = @clase.reservas.new
如果你要使用强参数规范写法,就把link_to的参数包裹到reserva层级下:
<%= link_to 'Reservar', cupo_clase_reserva_path(id: clas.id, reserva: {fecha: clas.fecha, clase_id: clas.id}) %>
控制器里改用强参数初始化,避免Rails的参数安全拦截:
@reserva = @clase.reservas.new(reserva_params) @reserva.idUsuario = current_usuario.id
- 错误回滚逻辑缺失
你当前在@reserva.save失败时直接render :index,但是reservas的index模板需要@reservas实例变量,你在cupoClase方法中没有定义这个变量,渲染时会报错。修复方式要么改为重定向到列表页,要么提前补全需要的实例变量:
else # 改成重定向避免变量缺失问题,同时把错误信息抛到前端显示 format.html { redirect_to clases_path, alert: @reserva.errors.full_messages.join(',') } format.json { render json: @reserva.errors, status: :unprocessable_entity } end
如果还排查不出问题,可以在save前加日志打印错误信息定位问题:
Rails.logger.debug "===== reserva保存错误:#{@reserva.errors.full_messages}" if !@reserva.valid? if @reserva.save # 原有逻辑
内容的提问来源于stack exchange,提问作者Miguel Rivera Sarmiento
相关产品推荐
相关产品推荐

