You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails嵌套路由报错:缺少必填键[:entry_id],求解决方法

问题分析与解决方案

问题根源拆解

1. 路由参数传递不匹配

你的路由定义中,update_position动作要求的参数是:entry_id,但视图里调用credit_update_position_path(@credit, entry.id)时,Rails会把第二个参数entry.id绑定到默认的:id参数上,而非路由要求的:entry_id,导致路由无法匹配,触发missing required keys: [:entry_id]错误。

2. 控制器方法存在多处错误

  • 直接调用@entry.find(params[:id]),但@entry未初始化,会触发NoMethodError;
  • 路由传递的参数是:entry_id,但你用params[:id]获取,会找不到对应值;
  • 缺少entry_params方法允许position参数传入,会导致参数不被Rails接受。

修复步骤

1. 修正视图中的路径生成

把视图里的路径调用改成明确指定entry_id参数:

data-sortable-update-url="<%= credit_update_position_path(@credit, entry_id: entry.id) %>"

2. 修正Entries控制器的update_position方法

def update_position
  # 用路由里的entry_id参数查找条目
  @entry = Entry.find(params[:entry_id])
  @entry.insert_at(entry_params[:position].to_i)
  head :ok
end

private

# 定义允许的参数
def entry_params
  params.require(:entry).permit(:position)
end

可选优化:路由简化(更符合Rails惯例)

你当前的路由可以简化,利用Rails嵌套路由的member动作:

Rails.application.routes.draw do 
  devise_for :users
  resources :credits do
    resources :entries do
      # 为单个entry添加update_position动作
      patch :update_position, on: :member
    end
  end
  get 'render/index'
  root 'render#index'
end

此时路径助手变为credit_entry_update_position_path,调用时直接传入对象即可:

data-sortable-update-url="<%= credit_entry_update_position_path(@credit, entry) %>"

对应的控制器方法可以改为:

def update_position
  @entry = Entry.find(params[:id])
  @entry.insert_at(entry_params[:position].to_i)
  head :ok
end

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:37:33