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

