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

Rails命名空间路由中form_with生成错误路径,如何省略url参数?

解决Rails命名空间嵌套资源form_with路径错误问题

问题根源

你遇到的错误是因为Rails自动解析命名空间下的模型时,重复叠加了命名空间前缀:Customer::Address模型会被默认带上customer前缀,再加上路由里的customer命名空间和user嵌套层级,就生成了错误的customer_user_customer_addresses_path路径。

解决方案

和你处理Customer::Contact的方式一致,给Customer::Address添加路由解析规则即可:

resolve('Customer::Address') { [:customer, :user, :address] }

把这段代码加到你的路由配置里,和Customer::Contact的resolve规则放在一起:

namespace :customer do
  resources :users do
    resource :contact
    resources :addresses
  end
end

resolve('Customer::Contact') { [:customer, :user, :contact] }
resolve('Customer::Address') { [:customer, :user, :address] }

添加完成后,<%= form_with model: [@user, @address] do |form| %>就能自动生成正确的路由路径,无需手动传入url参数。

原理说明

Rails的form_with通过模型的命名空间和关联关系生成路由,resolve方法的作用是明确告诉Rails:当遇到Customer::Address实例时,应该用[:customer, :user, :address]这组参数来匹配路由,避免了命名空间前缀的重复叠加。同时要确保@user.addresses.build生成的确实是Customer::Address实例(只要Customer::User的addresses关联指向正确的模型,这一点就自动满足)。

内容的提问来源于stack exchange,提问作者Luigi De Cosmis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:18:18