【发布时间】:2015-06-25 05:11:40
【问题描述】:
假设我有一个带有 cmets 和帖子的经典博客应用程序。 在这个应用程序中,cmets 总是嵌套在一个帖子下。
GET /posts/:posts_id/comments/:id ...
我想以某种方式覆盖 URL 帮助程序,以便我可以将它们视为 cmets 不是嵌套资源。
要求:
cmets 应该只使用嵌套的 url:
/posts/:posts_id/comments/:id
我应该可以做到:
comments_path @comment
和
redirect_to @comment
我试过了:
我可以让 Rails 生成不带前缀的路由助手:
resources :posts
scope '/posts/:post_id' do
resources :comments
end
但是comments_path(@comment) 仍然会给我ActionController::UrlGenerationError,因为post_id 没有设置。
我当然可以手动创建自己的辅助方法,但如果可能的话,我希望 rails 生成辅助方法。
据我了解,路线助手是ActionDispatch::Routing::UrlFor 周围的饰面。我一直在研究ActionDispatch::RoutingPolymorphicRoutes,但我找不到生成的助手如何将模型实例“序列化”为参数。
是否可以创建一个模型方法,用于路由助手将评论资源转换为参数时使用?
我正在考虑类似于to_param 的东西。
【问题讨论】:
-
你为什么不试试这样的!
resources :posts resources :comments,没有scope。 -
@jonsnow 谢谢,但你显然不明白这个问题。这会给我
user_comments_path,我需要提供 id 和 post_id。 -
我知道还有其他解决方案,例如使用装饰器,但我想知道是否可以在模型级别创建覆盖,以便我可以使用开箱即用的助手。
-
如果你不关心你的帖子路线,你可以做资源 :posts, :as => "" 做资源 :cmets end but obv 它很傻。
-
实际上@osman 提供了 Pythoneske 路由助手,例如
_comments和edit__comment。像我上面所做的那样使用scope确实给出了正确的路线和助手名称。
标签: ruby-on-rails ruby