如何在不指定父资源且不使用shallow的情况下生成嵌套资源URL?
解决方案:在模型层面配置自动生成嵌套URL
当然可以做到!而且完全不需要修改路由结构或者启用shallow嵌套,只需要在你的Notification模型里加几行代码就能实现这个需求。
1. 确认你的路由结构(你应该已经配置好了)
首先确保你的路由是标准的嵌套结构,比如:
# config/routes.rb Rails.application.routes.draw do resources :organizations do resources :notifications # 其他嵌套在组织下的资源也可以用同样方法处理 end end
2. 给Notification模型添加to_ary方法
在app/models/notification.rb中添加以下代码:
class Notification < ApplicationRecord belongs_to :organization # 你的其他模型逻辑(比如验证、回调等)... def to_ary [organization, self] end end
3. 效果说明
当你使用link_to "查看通知", @notification时,Rails的路由助手会自动识别to_ary方法,把@notification转换成[@organization, @notification]数组,从而生成符合要求的URL:/:organization_id/notifications/:id。
不仅是link_to,其他生成URL的方式比如notification_url(@notification)也会自动生成嵌套路径的URL,完全满足你不用手动传入父组织的需求,同时也保留了URL中的组织ID。
注意事项
- 确保每个
Notification实例都正确关联了Organization,否则调用organization方法会返回nil,导致生成URL时出错。 - 如果你的应用里还有其他嵌套在
Organization下的资源(比如Event、Task等),都可以套用这个方法,给对应模型添加to_ary方法返回[organization, self]即可。
内容的提问来源于stack exchange,提问作者Vincent Robert
相关产品推荐
相关产品推荐

