Rails应用Bootstrap模态框更新路由异常:/event.3而非/events/3
问题排查与解决方案
看起来你的问题出在路由配置错误以及Rails的form_for无法正确识别更新路径导致的,咱们一步步来理清楚:
核心问题分析
- 路由命名错误:你在配置
new动作的路由时,as: '/event'这个写法是错误的。as参数应该是一个符号(比如:new_event或者:event),而不是带斜杠的字符串,这会导致Rails生成的路由助手混乱,当form_for尝试生成更新路径时,错误地把id当成格式后缀,生成了/event.3这种路径。 - 手动路由与resources冲突:你混合使用了
resources :events和手动添加的路由,而且resources只包含了:create, :index,没有包含:edit, :update,导致Rails无法自动生成正确的更新路由助手,form_for找不到正确的PATCH路径,只能 fallback 到错误的路径。
解决方案
第一步:修正路由配置
优先用Rails的RESTful资源路由来管理,避免手动添加零散路由,把你的路由文件改成下面这样:
# config/routes.rb resources :events, only: [:new, :create, :index, :edit, :update]
这样Rails会自动生成所有你需要的路由,包括:
- GET
/events/new→events#new - GET
/events/:id/edit→events#edit - PATCH
/events/:id→events#update
同时会自动生成正确的路由助手,比如event_path(@event)会指向/events/:id,这正是你需要的更新路径。
如果你一定要保留手动的/event路径指向new动作(不推荐,不符合RESTful规范),可以改成:
resources :events, only: [:create, :index, :edit, :update] get '/event', to: 'events#new', as: :new_event # 这里as用正确的符号命名
第二步:确认form_for的行为
你的form_for @event, :remote => true代码本身是没问题的,只要@event是已经存在的记录(你在edit动作里已经通过current_user.events.find(params[:id])加载了正确的记录),Rails会自动识别这是一个更新操作,生成指向PATCH /events/:id的表单,而不是错误的/event.3。
第三步:验证路由
修改完路由后,运行rake routes,你应该能看到类似这样的输出:
Prefix Verb URI Pattern Controller#Action events GET /events(.:format) events#index POST /events(.:format) events#create new_event GET /events/new(.:format) events#new edit_event GET /events/:id/edit(.:format) events#edit event PATCH /events/:id(.:format) events#update PUT /events/:id(.:format) events#update
这里的event PATCH /events/:id(.:format)就是正确的更新路由,form_for会自动使用这个路径。
额外检查
你的FullCalendar的eventClick代码里的url是'events/' + event.id + '/edit',这个是正确的,和修正后的路由匹配,不需要修改。
这样修改后,点击更新按钮时,表单就会发送PATCH请求到/events/3而不是/event.3了。
内容的提问来源于stack exchange,提问作者BC2
相关产品推荐
相关产品推荐

