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
相关产品推荐
相关产品推荐

