如何在Rails符号式嵌套单动作路由中添加param参数?
问题分析与解决
你遇到的404是因为符号式路由定义没有显式指定路径中的内层参数占位符,导致生成的路由路径和预期不符。
原因
原字符串写法生成的路径是/abilities/:ability_slug/company/:slug(外层abilities的param: :slug会被Rails自动重命名为:ability_slug避免参数名冲突),而你用符号式delete :company, ...时,Rails默认生成的路径是/abilities/:ability_slug/company,没有包含内层的:slug参数,所以访问带slug的路径时无法匹配路由,返回404。
正确的符号式写法
需要通过path选项显式指定包含内层参数的路径模板,保持和原字符串写法一致的路径结构:
resources :abilities, param: :slug do delete :company, controller: :ability_companies, action: :destroy, path: 'company/:slug' end
这样生成的路由路径就和原写法完全一致,同时保持了符号式定义的风格。
如果需要明确指定内层参数的名称(避免和外层冲突),也可以结合param选项:
resources :abilities, param: :slug do delete :company, controller: :ability_companies, action: :destroy, path: 'company/:company_slug', param: :company_slug end
这种写法会把内层参数命名为:company_slug,在控制器中可以通过params[:company_slug]获取,避免和外层的params[:ability_slug]混淆。
内容的提问来源于stack exchange,提问作者zcserei
相关产品推荐
相关产品推荐

